我搜索了这些表达式的含义,但无法理解它们之间的确切差异。
这就是他们所说的:
?:
匹配表达,但不会捕获它。?=
匹配后缀,但将其排除在捕获之外。?!
如果没有后缀,则匹配。
我尝试在简单的正则时期使用它们,并获得了所有人的类似结果。
例如:以下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"的捕获。