正则表达式中的"?:"是什么作用?

3
我想使用正则表达式匹配除字符串外的任何内容。我进行了一些谷歌搜索,发现了这个: ^(?:(?!test).)*。请问 ?: 和 ?! 是什么意思?谢谢。
3个回答

5

(?:)是非捕获组。这意味着匹配会像往常一样发生,但是括号仅用于分组(在此情况下是为了将*运算符附加到整个内容上); 匹配的值不能稍后使用$1或\1来提取。

(?!)是负向前瞻断言。这意味着它匹配的是在括号中不存在的字符串。

有关更多操作符,请参见http://docs.python.org/library/re.html。虽然正则表达式在不同的编程语言中会有所差异,但它们通常非常相似。


0

是的...而(?!)是“零宽度负向先行断言”,根据“perldoc perlre”。

这意味着不要匹配括号中的内容。文档中的示例为:

For example "/foo(?!bar)/" matches any occurrence of "foo" that isn’t followed by "bar".

所以在这个例子中,foobar不会匹配,但fooxbar会匹配,foo和foofoo等也会匹配。

哦,是的,所以你给出的例子应该匹配任何不包含“test”的内容。我认为更清晰的方法是匹配/test/并在正则表达式评估之外否定,例如“grep -v test”。


0

?! 表示负向先行断言。包含负向先行断言的表达式只有在负向先行断言中的表达式未匹配时才返回匹配项。这意味着"(?!test)."只有在不匹配"test"时才会返回匹配项。

外部分组"(?:(?!test).)"称为被动分组,其功能等同于"((?!test).)"。区别在于使用被动分组时不会创建反向引用,因此更加高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接