我很想写一个正则表达式来在多行 c 风格的注释中找到一个标记并将其从注释中删除。例如做如下变换:
/*
* comments
SpecialToken
* commetns
*/
->
/*
* comments */
SpecialToken
/** comments
*/
每当在源文件中找到上述内容时。
我在网上(http://ostermiller.org/findcomment.html)找到了一个匹配 /* */ 样式注释的正则表达式:
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
我的特殊标记类似于:\nSpecialToken\n,我编辑了以前的正则表达式以获得以下内容:
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*cloneVerifierMarker_39843829489349873478202370870872077223082([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
然后,我将 perl 单线从评论中删除:
perl -pi -e 'BEGIN{undef $/;} s/(\/\*(?:[^*]|[\r\n]|(?:\*+(?:[^*\/]|[\r\n])))*)\ncloneVerifierMarker_39843829489349873478202370870872077223082\n((?:[^*]|[\r\n]|(?:\*+(?:[^*\/]|[\r\n])))*\*+\/)/$1\*\/\ncloneVerifierMarker_39843829489349873478202370870872077223082\n\/\*$2/g' temp/file
它的工作原理是从评论中删除标记,但它似乎也能找到特殊标记不在评论中的情况。例如:
以下文件中注入了两个 SpecialToken,一次在注释内(第 34 行),一次在注释外(第 2342 行):
在我运行 perl one-liner 后,我得到以下信息:
特殊标记已成功从评论中删除,但即使第二个实例不在评论中,仍会处理它。
我不确定为什么会发生这种情况:(。
我这样做的原因是我需要在源代码的转换中跟踪一段代码。这些转换会删除注释,因此如果将特殊标记注入到注释中,我需要将其从中删除。
谢谢你的帮助 :)。