我有以下正则表达式:
.*(?:(?:(?<!a)cc|string).*number).*
我试图理解括号中字符串开头的?
是什么意思。我知道了吗?意味着前一个字符'a'可以重复零次或一次。但是它出现在字符串的开头是什么意思呢?
答案 0 :(得分:5)
答案需要一点历史课。当Larry Wall希望在Perl中为正则表达式添加新功能时,他不能仅仅改变现有元字符的含义,或者为没有它们的字符分配特殊含义。这会破坏许多一直有效的正则表达式。相反,他必须寻找永远不会出现在正则表达式中的字符序列。
最初只有一种组:我们现在称之为捕获组。左括号是一个元字符,所以用量词跟随它是没有意义的。您可以使用\(?
匹配文字开放式零或一次,或者您可以使用(\?)
匹配(并捕获)文字问号,但如果您尝试使用(?
正则表达式会引发异常。
Larry更改了规则,因此(?
可以出现在正则表达式中,但必须形成特殊组构造的开头,这需要至少再多一个字符。因此,要回答您的问题,字符串不会以?
开头。序列(?:
形成单个标记,表示非捕获组的开始。我们还有(?=
和(?!
用于正面和负面的前瞻,(?<=
和(?<!
用于外观,等等。
答案 1 :(得分:2)
(?:)
是non-capturing group。它只进行匹配操作。它不会捕获任何东西。
(?<!)
是Negative lookbehind。