首页 > 解决方案 > 为什么在正则表达式中“?括号后立即”是语法错误?

问题描述

Python 正则表达式 HOWTO 解释了非捕获组和命名组的语法是如何产生的:

对于这些新特性,Perl 开发人员无法选择新的单键元字符或新的特殊序列以\不使 Perl 的正则表达式与标准 RE 混淆地不同。例如,如果他们选择&作为新的元字符,旧表达式将假定这&是一个常规字符,并且不会通过编写\&or来转义它[&]

Perl 开发人员选择的解决方案是(?...)用作扩展语法。?括号之后是一个语法错误,因为?没有什么可重复的,所以这并没有引入任何兼容性问题。

我不明白为什么括号应该有重复的东西?我确实理解将导致语法错误的东西用于扩展正则表达式功能的总体观点,这将防止现有的正则表达式被破坏。

标签: regexregex-group

解决方案


regular-expressions.info很好地解释了它。

... 问号是使前一个标记可选的量词。这个量词不能出现在左括号之后,因为在组的开头没有什么是可选的。因此,问号作为使标记可选的运算符与问号作为非捕获组语法的一部分之间没有歧义......

没有什么是可选的,因为 之前的标记?是组开放元字符(,而不是在字符串中可搜索的东西,例如常规字符。

我不同意您链接到的 HOWTO 中的措辞。可选的——即零次或一次——不是“重复”的。


推荐阅读