Regex 在正则表达式中注释不匹配

Regex 在正则表达式中注释不匹配,regex,Regex,我需要在正则表达式中用X字符“注释”每个不匹配项,例如,如果我有一个文本文件,如: Line1Name: this is a (string). Line2Name: (a string) Line3Name this is a line without parenthesis Line4Name: (a string 2) 现在,以下正则表达式将匹配a之前的所有内容: ^[^:]+(?=:) 因此,结果将是 Line1Name: Line2Name: Line4Name: 但是,我需要在

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

Line1Name: this is a (string).
Line2Name: (a string)
Line3Name this is a line without parenthesis
Line4Name: (a string 2)
现在,以下正则表达式将匹配a之前的所有内容:

^[^:]+(?=:)
因此,结果将是

Line1Name:
Line2Name:
Line4Name:
但是,我需要在第3行注释不匹配,有以下输出:

Line1Name: 
Line2Name:
X
Line4Name:

正则表达式可以做到这一点吗?

如果您了解了正则表达式是什么,您将意识到不可能单独使用正则表达式进行逻辑运算。引述:

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

强调我的——简单地说,正则表达式是一种寻找字符串的奇特方式;它要么匹配,要么不匹配

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

# assuming your string is in $str
result="$([[ $str =~ ^[^:]+: ]] && echo "${str%:*}" || echo "X")"
这在支持正则表达式模式(Ruby)的语言中也起到了同样的作用:


作为旁注,您的示例代码与输出不匹配:您对冒号使用了一个前瞻,它在匹配中排除了冒号,但您的输出包含了冒号。在我的示例中,我选择在输出模式上使用正则表达式,从而将冒号从结果中排除。

您可以尝试使用脚本语言,使用给定的正则表达式查找其是否不匹配。
awk'/^[^::::+:/{print$1;next}{print“X”}'file
在bash解决方案中使用了两种技术:regex匹配用于测试,模式匹配用于echo,在我看来,仅使用bash_REMATCH更容易理解。@nshy:关于语句的清晰性,这是正确的,但如果我这样做的话,我将不得不在bash_REMATCH上使用模式匹配来消除尾随冒号(参见我的答案的最后一段关于为什么我在匹配中省略冒号的内容)如。
# assuming your string is in str
result = str.match(/^[^:]+(?=:)/) || "X"