【发布时间】:2011-02-04 06:30:39
【问题描述】:
我正在尝试使用 Python 和 Regex 计算 C 代码中包含的 cmets 中的字符,但没有成功。我可以先擦除字符串以摆脱字符串中的 cmets,但这也会擦除 cmets 中的字符串,结果将是 bad ofc。是否有机会通过使用正则表达式来询问与 cmets 中的字符串不匹配,反之亦然?
【问题讨论】:
-
我相信这是不应该使用正则表达式的事情之一
我正在尝试使用 Python 和 Regex 计算 C 代码中包含的 cmets 中的字符,但没有成功。我可以先擦除字符串以摆脱字符串中的 cmets,但这也会擦除 cmets 中的字符串,结果将是 bad ofc。是否有机会通过使用正则表达式来询问与 cmets 中的字符串不匹配,反之亦然?
【问题讨论】:
不,不是。
Regex 不是像您描述的那样解析嵌套结构的正确工具;相反,您将需要解析 C 语法(或您感兴趣的“哑子集”),并且您可能会发现正则表达式对此很有帮助。一个相对简单的具有三种状态(CODE、STRING、COMMENT)的状态机就可以了。
【讨论】:
'/*' 是一个多字符字符常量;它具有未定义或实现定义的行为,但不开始评论。
正则表达式并不总是替代real parser。
【讨论】:
您可以通过搜索正则表达式来去除所有不在 cmets 中的字符串:
'[^'\r\n]+'|(//.*|/\*(?s:.*?)\*/)
并替换为:
$1
本质上,这会搜索匹配字符串或评论的正则表达式string|(comment),捕获评论。如果匹配字符串,则替换为空;如果匹配注释,则替换为注释。
虽然正则表达式不能替代真正的解析器,但您可以通过创建一个巨大的正则表达式来快速构建一个基本的解析器,该正则表达式替换您感兴趣的所有标记(在本例中为 cmets 和字符串)。如果您正在编写一些代码来处理 cmets,而不是字符串中的那些,请遍历上述正则表达式的所有匹配项,并计算第一个捕获组中的字符(如果它参与了匹配项)。
【讨论】: