-2

我很想写一个正则表达式来在多行 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 行):

http://pastebin.com/Yq185G8g

在我运行 perl one-liner 后,我得到以下信息:

http://pastebin.com/LYftGBX1

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

我不确定为什么会发生这种情况:(。

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

谢谢你的帮助 :)。

4

1 回答 1

0

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

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

在这里测试代码。

于 2012-08-15T02:35:53.470 回答