2012-07-18 78 views
0

我需要“注解”以X形正则表达式的每个匹配,例如,如果我有这样一个文本文件:诠释不匹配

Line1Name: this is a (string). 
Line2Name: (a string) 
Line3Name this is a line without parenthesis 
Line4Name: (a string 2) 

现在下面的正则表达式将之前匹配所有答:

^[^:]+(?=:) 

这样的结果将是

Line1Name: 
Line2Name: 
Line4Name: 

但是我需要注释第3行的不匹配,有这样的输出:

Line1Name: 
Line2Name: 
X 
Line4Name: 

这是可能的正则表达式吗?

+1

您可以尝试使用脚本语言来查找是否使用给定的正则表达式匹配它。 – Jithin 2012-07-18 05:51:09

+0

'awk'/^[^:] +:/ {print $ 1;下一步} {打印“X”}'文件' – tripleee 2012-07-18 06:41:55

回答

1

如果你看看正则表达式是什么,你会意识到不可能仅用一个正则表达式来进行逻辑运算。引述Wikipedia

在计算中,正则表达式提供一个简明的和灵活的方法,以“匹配”(指定和识别)文本字符串,如特定的字符,单词或字符的图案。

强调我的 - 简单地说,正则表达式是找到字符串的奇特方式;它要么(它匹配),要么不会。

为了实现您的目标,您需要某种逻辑开关,用于对正则表达式搜索的匹配/不匹配结果进行操作并触发一个操作。你有没有在您使用您正则表达式什么样的环境,因此提供了一个解决方案是一个有点毫无意义的规定,但作为一个例子,这个会做什么你想在纯bash做:

# assuming your string is in $str 
result="$([[ $str =~ ^[^:]+: ]] && echo "${str%:*}" || echo "X")" 

这做同样的事情在语言支持您的正则表达式(红宝石):

# assuming your string is in str 
result = str.match(/^[^:]+(?=:)/) || "X" 

作为一个侧面说明,您的示例代码的输出不匹配:您使用的是超前的结肠癌,其排除在比赛,但你的输出包括它。在我的示例中,我选择在您的输出模式中使用正则表达式,因此从结果中排除冒号。

+0

在bash解决方案中使用2种技术:正则表达式匹配测试和模式匹配回显,在我看来,使用BASH_REMATCH会更容易理解。 – nshy 2012-07-21 15:45:04

+0

@nshy:对于声明的清晰性是真实的,但是我必须在BASH_REMATCH上使用模式匹配,而不是使用尾部冒号(请参阅我的答案的最后一段,为什么我忽略匹配中的冒号)因为[扩展正则表达式不支持lookahead断言](http://developer.apple.com/documentation/Darwin/Reference/Manpages/man7/re_format.7.html)。 – kopischke 2012-07-21 16:40:15