使用正则表达式取消注释特殊标记(仅当它出现在/ * * / style注释中时)。在perl单线

时间:2012-08-15 01:41:46

标签: regex perl

我正在编写一个正则表达式,用于在多行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行)之外:

http://pastebin.com/Yq185G8g

运行perl one-liner后,我得到以下内容:

http://pastebin.com/LYftGBX1

特殊令牌已成功从评论中删除,但第二个实例仍处理,即使它不在评论中。

我不确定为什么会这样:(。

我这样做的原因是我需要在源代码的转换中跟踪一段代码。这些转换删除了注释,因此如果在注释中注入特殊标记,我需要将其从中删除。

感谢您的帮助:)。

1 个答案:

答案 0 :(得分:0)

我相信你正在寻找这个正则表达式:

s/(\/\*)(?:(?!.*?\*\/.*?SpecialToken)(.*?)(SpecialToken)(.*?))(\*\/)/$1$2\*\/$3\/\*$4$5/gs;

测试代码here