区别?:?!和 ?=

2022-08-30 01:41:58

我搜索了这些表达的含义,但无法理解它们之间的确切区别。

这是他们说的:

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

我尝试在简单的正则表达式中使用这些,并得到了类似的结果。

例如:以下 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]+)*

答案 1

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

和 之间的区别在于,从整个匹配项中排除表达式,而不创建捕获组。例如,将匹配“abc”中的“ab”,而仅匹配“abc”中的“a”。 将匹配“abc”中的“ab”,并创建包含“b”的捕获。?:?=?=?:a(?:b)a(?=b)a(b)


答案 2
?:  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 非常好的教程和正则表达式中的示例。