注释正则表达式中的不匹配



我需要用一个X字符"注释"正则表达式中每个不匹配的字符,例如,如果我有一个文本文件,如:

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

现在,下面的正则表达式将匹配a之前的所有内容:

^[^:]+(?=:)

所以结果将是

Line1Name:
Line2Name:
Line4Name:

然而,我需要在第三行注释不匹配,输出如下:

Line1Name: 
Line2Name:
X
Line4Name:

这在正则表达式中可能吗?

如果您了解了正则表达式是什么,就会意识到仅靠正则表达式是不可能进行逻辑运算的。引用维基百科:

在计算中,正则表达式提供了一种简洁灵活的方法来"匹配"(指定和识别)文本字符串,例如特定的字符、单词或字符模式。

emphasis mine–简单地说,正则表达式是查找字符串的一种奇特方法;它要么匹配,要么不匹配。

为了实现您想要的目标,您需要某种逻辑开关,它可以对正则表达式搜索的匹配/不匹配结果进行操作并触发操作。您还没有指定在什么环境中使用regex,因此提供解决方案有点毫无意义,但作为一个示例,这将完成您在纯bash:中尝试做的事情

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

这在支持正则表达式模式(Ruby)的语言中也起到了同样的作用:

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

顺便说一句,您的示例代码与输出不匹配:您对冒号使用了前瞻性,这将其排除在匹配中,但您的输出包含了它。在示例中,我选择了使用正则表达式而不是输出模式,从而将冒号排除在结果之外