有什么区别?:,?!和?=在正则表达式?

时间:2012-05-29 18:33:57

标签: javascript regex

我搜索了这些表达的含义,但无法理解它们之间的确切差异。 这就是他们所说的:

  • ?:匹配表达式,但不捕获它。
  • ?=匹配后缀但将其从捕获中排除。
  • ?!匹配if后缀不存在。

我尝试在简单的RegEx中使用这些,并获得了类似的结果。 例如:以下3个表达式给出了非常相似的结果。

  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*

5 个答案:

答案 0 :(得分:99)

?=?!之间的区别在于前者要求给定的表达式匹配,后者要求匹配。例如,a(?=b)将匹配“ab”中的“a”,但不匹配“ac”中的“a”。而a(?!b)将匹配“ac”中的“a”,而不匹配“ab”中的“a”。

?:?=之间的区别在于?=排除了整个匹配中的表达式,而?:只是没有创建捕获组。因此,例如a(?:b)将匹配“abc”中的“ab”,而a(?=b)将仅匹配“abc”中的“a”。 a(b)与“abc”中的“ab”匹配,创建包含“b”的捕获。

答案 1 :(得分:61)

?:  is for non capturing group
?=  is for positive look ahead
?!  is for negative look ahead
?<= is for positive look behind
?<! is for negative look behind

请在此处查看:http://www.regular-expressions.info/lookaround.html,了解非常好的教程和正则表达式中的前瞻示例。

答案 2 :(得分:5)

尝试将foobar与这些匹配:

/foo(?=b)(.*)/
/foo(?!b)(.*)/

第一个正则表达式将匹配并将返回&#34; bar&#34;作为第一个子匹配 - (?=b)与&#39; b&#39;匹配,但不使用它,留下以下括号。

第二个正则表达式不匹配,因为它期望&#34; foo&#34;接下来是与&#39; b&#39;。

不同的东西

(?:...)与简单(...)具有完全相同的效果,但它不会将该部分作为子匹配返回。

答案 3 :(得分:0)

了解断言的最简单方法是将断言视为插入正则表达式中的命令。 当引擎运行到断言时,它将立即检查断言描述的条件。 如果结果为true,则继续运行正则表达式。

答案 4 :(得分:0)

这是真正的区别:

>>> re.match('a(?=b)bc', 'abc')
<Match...>
>>> re.match('a(?:b)c', 'abc')
<Match...>

# note:
>>> re.match('a(?=b)c', 'abc')
None

如果您不关心“?:”或“?=“,“ ?:”和“?=””之后的内容相同。两者都可以使用。

但是,如果您需要这些内容以进行进一步的处理(不仅要与整个过程匹配,在这种情况下,您可以简单地使用“ a(b)”),而必须使用“?=”。原因“?:”将通过它消失。