我正在编写一个正则表达式,用于在多行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 one-liner从评论中删除:
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后,我得到以下内容:
特殊令牌已成功从评论中删除,但第二个实例仍处理,即使它不在评论中。
我不确定为什么会这样:(。
我这样做的原因是我需要在源代码的转换中跟踪一段代码。这些转换删除了注释,因此如果在注释中注入特殊标记,我需要将其从中删除。
感谢您的帮助:)。
答案 0 :(得分:0)
我相信你正在寻找这个正则表达式:
s/(\/\*)(?:(?!.*?\*\/.*?SpecialToken)(.*?)(SpecialToken)(.*?))(\*\/)/$1$2\*\/$3\/\*$4$5/gs;
测试代码here。