【问题标题】:Only find multiline C comment but not single line C comments仅查找多行 C 注释,但不查找单行 C 注释
【发布时间】: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][^/"'\]*)

标签: regex perl


【解决方案1】:

你可以使用

perl -0777 -pe 's~/\*(?:(?!\*/|/\*).)*\R(?s).*?\*/~~g' file

模式匹配

  • /\* - /* 字符串
  • (?:(?!\*/|/\*).)* - 除换行符以外的零个或多个字符,每个字符都不是 *//* 字符序列的起始字符​​li>
  • \R - 换行序列
  • (?s) - 现在,. 也将匹配换行符
  • .*? - 尽可能少的零个或多个字符
  • \*/ - */ 子字符串。

请参阅regex demo

【讨论】:

    【解决方案2】:

    使用 SKIP/FAIL 方法:

    perl -0777 -pe's~/\*\N*?\*/(*SKIP)^|/\*.*?\*/~~gs' file
    

    demo

    \N 匹配所有非换行符
    自使用 s 标志以来,点匹配所有字符,包括换行符。

    第一个分支匹配“内联”cmets,并以^ 强制失败(比写(*F)(*FAIL) 短,但结果相同)。 (*SKIP) 回溯控制动词强制不重试先前的位置,因此下一次尝试在结束 */ 的位置之后开始。

    第二个分支匹配剩余的必须多行的 cmets。


    一个较短的变体,具有相同的两个分支,但这次使用\K 从匹配结果中排除消耗的字符:

    perl -0777 -pe's~/\*\N*?\*/\K|/\*.*?\*/~~gs' file
    

    demo

    这次第一个分支成功了,但是由于\K之前的所有字符都从匹配结果中删除,剩下的空字符串被替换为空字符串。


    这两个搜索/替换与更便携的操作没有太大区别:

    s~(/\*.*?\*/)|/\*[\s\S]*?\*/~$1~g
    

    但工作量较小(不需要捕获组,替换字符串为空)。

    【讨论】:

    • 这些都非常有效。我也喜欢便携版。
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多