如果2个字符串中的任何一个不在多行目标中,则匹配RegEx

时间:2017-06-16 17:08:52

标签: regex

我试图建立一个将用于命令输出的RegEx,并且只有在2个字符串中的任何一个时才匹配(例如:" down" |&# 34;在具有多行的目标字符串中找不到错误")。以下是命令输出我的目标示例:

Command output:
Service 1 up
Service 2 down
Service 3 up

以下具有负前瞻断言的RegEx始终匹配(0到0),无论命令输出如何:

(?!.*(down|error))

为什么它不起作用,RegEx可以满足请求?

谢谢,

2 个答案:

答案 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"结尾。