【发布时间】:2022-01-23 21:55:07
【问题描述】:
假设我有这个文本:
cat file
/* comment */ not a comment /* another comment */
/* delete this *
/* multiline *
/* comment */
/*************
/* and this *
/************/
The End
我可以使用perl 和条件? : 来仅删除多行注释:
perl -0777 -pE 's/(\/\*(?:\*(?!\/)|[^*])*\*\/)/($1=~qr"\R") ? "" : $1/eg;' file
打印:
/* comment */ not a comment /* another comment */
The End
无条件:
perl -0777 -pE 's/(\/\*(?:\*(?!\/)|[^*])*\*\/)//g;' file
not a comment
The End
有没有办法只删除带有正则表达式的多行 C 样式 cmets?即,替换中不使用perl条件代码?
【问题讨论】:
-
感谢您的链接。除非我遗漏了什么,否则它不会回答如何将匹配限制为仅多行 cmets。我找到的最接近的是THIS,这与我的条件方法基本相同。
-
“有些人在遇到问题时会想“我知道,我会使用正则表达式。” 现在他们有两个问题。” -- Jamie Zawinski
-
“有些人在遇到问题时会想“我知道,我会在 Stack Overflow 上问一个关于正则表达式的问题”现在他们有收到了一个非常好的解决方案。”
-
@sin:非常非常公平的观点。我想我并没有尝试编写完整的注释编译器。 C 注释可能是perverse。我只是为 90% 的情况拍摄。
-
好吧对不起,它看起来像是一个脚本文件目标。我把它误读为 C 语言文件。但对于 C C++ 来说,它不必那么反常。只需要一个简单的回调替换逻辑,因为这个模板可以匹配所有内容 (/*[^*]**+(?:[^/*][^*]**+)*/|//(?:[ ^\]|\\\n?)*?\n)|("(?:\[\S\s]|[^"\])*"|'(?:\[\S\s]| [^'\])*'|[\S\s][^/"'\]*)