正则表达式忽略匹配中的部分字符串

时间:2017-07-26 01:01:16

标签: regex

假设我有一个标签对象:

var getMouseOnCircle = ( function () {

    var vector = new THREE.Vector2();

    return function getMouseOnCircle( pageX, pageY ) {

        vector.set(
            ( ( pageX - _this.screen.width * 0.5 - _this.screen.left ) / ( _this.screen.width * 0.5 ) ),
            ( ( _this.screen.height + 2 * ( _this.screen.top - pageY ) ) / _this.screen.width ) // screen.width intentional
        );

        return vector;

    };

}() );

我希望能够使用正则表达式匹配“失败”但排除“警告 - 错误 - 致命 - 失败 - 异常 - 确定”。

所以在上面的例子中,如果我使用我的正则表达式搜索失败,它应该只匹配parsefailure上的失败而忽略其余的。

如何使用正则表达式实现这一目标?

注意:正则表达式必须排除整个字符串“warn-error-fatal-failure-exception-ok”

2 个答案:

答案 0 :(得分:1)

修改

在记录下面的答案后,我意识到你正在寻找的可能是:

(?<!warn-error-fatal-)failure(?!-exception-ok)

所以我在这里添加它,以防它适合你想要的更好。这个正则表达式只是在寻找&#34;失败&#34;但使用Negative LookbehindNegative Lookahead来指定&#34;失败&#34;可能不会出现&#34; warn-error-fatal - &#34;或者后跟&#34; -exception-ok&#34;。

从评论中发展出来的答案:

以下正则表达式捕获了&#34;失败&#34; &#34; parsefailure&#34;中的子字符串标记,它将它放在第1组:

^.*"(?![^"]*warn-error-fatal-failure-exception-ok[^"]*)[^"]*(failure)[^"]*".*$

DETAIL

我将打破部分正则表达式,我将解释每一个。首先,让我们忘记第一组括号之间的所有内容,让我们看看其余的内容。

^.*"[^"]*(failure)[^"]*".*$

正则表达式的重要部分是我们试图在小组中捕获的内容,即&#34;失败&#34;它本身是由双引号包围的标签的一部分。上面的正则表达式匹配整个测试字符串,但它侧重于由双引号括起来并包含子字符串的标记&#34;失败&#34;。

^.*"匹配从字符串开头到引号的任何字符

"[^"]*(failure)[^"]*"匹配由双引号括起并包含子字符串&#34;失败&#34;的标记。从字面上看:双引号,后跟零或多个不是双引号的字符,接着是&#34;失败&#34;,后跟零个或多个不是双引号的字符,后跟双引号。括号中包含“&#34;失败&#34;在第1组中。

".*$匹配双引号到测试字符串末尾的任何字符

因为[^"]*(failure)[^"]*匹配包含子字符串的所有标记&#34;失败&#34;,^.*"[^"]*(failure)[^"]*".*$将捕获子字符串&#34;失败&#34;从包含字符串的第一个标签。换句话说,它将捕获&#34;失败&#34;来自warn-error-fatal-failure-exception-ok标记,这不是我们想要的,因此我们大多数排除warn-error-fatal-failure-exception-ok标记与正则表达式的标记部分匹配:[^"]*(failure)[^"]*。这是通过Negative Lookahead

实现的
(?![^"]*warn-error-fatal-failure-exception-ok[^"]*)

Negative Lookahead基本上意味着:&#34; Negative Lookahead后面的正则表达式无法与[^"]*warn-error-fatal-failure-exception-ok[^"]*&#34;匹配。 (?!)只是语法的一部分。您可以阅读更多相关信息here

更加突破

^匹配测试字符串的开头

.*匹配任何字符零次或多次

"匹配双引号字符

[^"]*匹配双引号字符以外的任何字符零次或多次

(failure)匹配&#34;失败&#34;,因为它在括号中,它将在一个组中捕获它;在这种情况下,它将在组1中捕获,因为只有一组捕获括号。负面前瞻的括号是无法捕捉的。

$匹配测试字符串的结尾

答案 1 :(得分:0)

RegularExpression[A-Za-z-]*(?<!("warn-error-fatal-))failure

识别parsefailure和“syslog-warn-error-fatal-failure-exception-ok”而不是其他失败。