为什么先行检查每个角色?

时间:2016-03-01 18:35:55

标签: javascript regex

我有这个正则表达式

^((?!['"])[\x00-\x7F])*$

并且它匹配以下字符串

no its all right lag

我通过RegexBuddy调试器运行它,似乎在每个文字字符匹配后检查否定外观(?!['"])

enter image description here

它是如何运作的?

2 个答案:

答案 0 :(得分:3)

是的,它会检查[\x00-\x7F]匹配的每个字符。

此处的否定前瞻用于限制[\x00-\x7F]字符类。该模式可以描述为匹配整个字符串,该字符串仅包含'" 之外的ASCII字符。由于您将*量词应用于((?!['"])[\x00-\x7F])组,因此正则表达式引擎尝试将此模式从字符串的开头到其结尾匹配零次或多次,从而检查其中的每个位置。如果将范围拆分为:

,则可以使此表达式更有效
^[\x00-\x21\x23-\x26\x28-\x7F]*$

您可以避免使用前瞻导致的回溯(请注意"\x22'\x27)。

请参阅regex demo

enter image description here

答案 1 :(得分:3)

此正则表达式匹配if (childCount >= 1) { if (i == 0) c.drawLine(v.getX() + v.getPaddingLeft(), v.getHeight() / 2 - v.getY(), v.getX() + v.getPaddingLeft(), v.getHeight(), paint); else if (i == childCount - 1) c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getY() + v.getHeight() / 2, paint); else c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getHeight() + v.getY(), paint); } c.drawCircle(v.getX() + v.getPaddingLeft(), v.getY() + v.getHeight() / 2, 8, paint); 范围内的0个或更多ascii字符,但单引号和双引号字符除外。

RegEx分手:

bool result = list1.Any(elem => list2.Values.Contains(elem));

所以在匹配0-127中的任何ascii字符之前,负向预告断言下一个字符位置不是单引号/双引号。