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

这就是他们所说的:

  • ?:匹配表达,但不会捕获它。
  • ?=匹配后缀,但将其排除在捕获之外。
  • ?!如果没有后缀,则匹配。

我尝试在简单的正则时期使用它们,并获得了所有人的类似结果。

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

答案

和…之间的不同?=?!是前者需要给定表达式匹配,后者需要它not 匹配。例如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"的捕获。

来自: stackoverflow.com