我正在尝试使用相当复杂的正则表达式来匹配C / C ++函数定义。我发现了一个不起作用的案例,我试图理解为什么。这是输入字符串不匹配:
void Dump(const char * itemName, ofstream & os)
这显然是一个有效的C ++方法声明。这是RE:
^[^=+-|#]*?([\w<>]+\s+(?!if|for|switch|while|catch|return)\w+)\s*\([^;=+-|]*$
这基本上试图区分看起来像方法声明的其他C语法,即具有单词后跟paransheses的语法。
使用非常有用的Python正则表达式调试器(http://www.pythonregex.com/)我将其缩小到尾随“$” - 如果我删除正则表达式中的尾随$,它匹配上述方法签名;如果我留在$,它不会。必须有一些Python RE的特性,这是我在这里躲避的。感谢。
答案 0 :(得分:4)
在您的角色类+-|
中使用[^;=+-|]
是范围规范。这将导致包含(实际上排除,因为您使用^
)的字符类比您想要的要多得多。要在字符类中指定文字-
,请先提及[^-;=+|]
。
答案 1 :(得分:1)
PythonRegex的输出有些误导。 r.groups()
和r.findall()
的结果都是相同的:u'void Dump'
,这是第一个捕获组的内容。如果它显示了整个匹配项,那么当您删除$
时,您只会看到匹配
void Dump(
...不是你想要的整个功能定义。原因(正如Greg解释的那样)是你上一个字符类中的语法错误。您需要首先列出连字符([^-;=+|]
)或最后一个([^;=+|-]
),或者添加反斜杠([^;=+\-|]
)来转义连字符。
我能看到让PythonRegex显示整个匹配的唯一方法是删除所有捕获组(或将它们转换为非捕获组)。