?正则表达式中的字符

时间:2014-08-25 10:10:31

标签: regex

我有以下正则表达式:

.*(?:(?:(?<!a)cc|string).*number).*

我试图理解括号中字符串开头的?是什么意思。我知道了吗?意味着前一个字符'a'可以重复零次或一次。但是它出现在字符串的开头是什么意思呢?

2 个答案:

答案 0 :(得分:5)

答案需要一点历史课。当Larry Wall希望在Perl中为正则表达式添加新功能时,他不能仅仅改变现有元字符的含义,或者为没有它们的字符分配特殊含义。这会破坏许多一直有效的正则表达式。相反,他必须寻找永远不会出现在正则表达式中的字符序列

最初只有一种组:我们现在称之为捕获组。左括号是一个元字符,所以用量词跟随它是没有意义的。您可以使用\(?匹配文字开放式零或一次,或者您可以使用(\?)匹配(并捕获)文字问号,但如果您尝试使用(?正则表达式会引发异常。

Larry更改了规则,因此(?可以出现在正则表达式中,但必须形成特殊组构造的开头,这需要至少再多一个字符。因此,要回答您的问题,字符串不会以?开头。序列(?:形成单个标记,表示非捕获组的开始。我们还有(?=(?!用于正面和负面的前瞻,(?<=(?<!用于外观,等等。

答案 1 :(得分:2)

(?:)non-capturing group。它只进行匹配操作。它不会捕获任何东西。

(?<!)Negative lookbehind