我试图建立一个将用于命令输出的RegEx,并且只有在2个字符串中的任何一个时才匹配(例如:" down" |&# 34;在具有多行的目标字符串中找不到错误")。以下是命令输出我的目标示例:
Command output:
Service 1 up
Service 2 down
Service 3 up
以下具有负前瞻断言的RegEx始终匹配(0到0),无论命令输出如何:
(?!.*(down|error))
为什么它不起作用,RegEx可以满足请求?
谢谢,
答案 0 :(得分:1)
尝试'^((?!(down|error)).)*$'
这可以确保它匹配字符串开头的任何字符,而不是'down'
或'error'
,根据需要多次匹配。请注意,此RegEx区分大小写,并且会将字符串与'Down'
匹配。
你的RegEx实际上没有任何意义,因为它包含一个负面的预测,但没有任何东西可以向前看。因此,它将匹配0个字符(或空字符串''
),后跟任意数量的字符,然后'down'
或'error'
。即使您的字符串中包含字符'down'
或'error'
,您仍然可以在模式'down'
或'error'
内匹配您的RegEx。
注意:否定断言适用于较小的规则,而不适用于整个字符串。最常用的示例是找到q
后面没有u
的{{1}},例如在sheqalim
中。在这种情况下,您可能想要找到q
的位置。但是,根据您的情况,您似乎只想确定字符串中是否包含'down'
或'error'
,使用内置函数更有效和更简单,如果使用任何语言你使用的是一个。如果它没有,那么也可以更容易地看到您是否可以匹配'down'
或'error'
并否定它。我提供的RegEx应该是最后的手段。
答案 1 :(得分:1)
首先,测试模式的缺席通常不是在正则表达式中做事的正确方法,而且使用正则表达式会更好:
/(down|error)/mi
然后否定表示表达式是否匹配的布尔值。
然而,仅如果无法否定匹配,您可以使用类似/^Command output:\s\s?(.*up\s\s?)+(.*up)?$/i
的内容来确保每一行都以#34; up"结尾。