正则表达式匹配C风格的多行评论

时间:2012-10-22 15:44:48

标签: java regex string

我有一个字符串,例如

String src = "How are things today /* this is comment *\*/ and is your code  /*\* this is another comment */ working?"

我想从/* this is comment *\*/字符串中删除/** this is another comment */src个子字符串。

我尝试使用正则表达式但由于经验不足而失败。

7 个答案:

答案 0 :(得分:26)

最佳多行注释正则表达式(?s)/\*.*?\*/的展开版本,看起来像

String pat = "/\\*+[^*]*\\*+(?:[^/*][^*]*\\*+)*/";

请参阅regex101.com上的正则表达式解释。

简而言之,

  • /\*+ - 匹配评论开始,/*以及之后的任何0+星号
  • [^*]*\*+ - 匹配*以外的0 +个字符,后跟1 +字面*
  • (?:[^/*][^*]*\*+)* - 0+序列:
    • [^/*][^*]*\*+ - 不是/*(与[^/*]匹配),后跟0 +非星号字符([^*]*),后跟1 +星号(\*+
  • / - 关闭/

David's regex需要 26个步骤才能在我的示例字符串中找到匹配项,而my regex只需要 12个步骤。由于在正则表达式引擎执行的每个位置都存在惰性模式扩展,而且我的模式匹配线性块,文字一气呵成。

答案 1 :(得分:14)

尝试使用此正则表达式(仅限单行注释):

String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("/\\*.*?\\*/","");//single line comments
System.out.println(result);

REGEX解释:

  

字面匹配字符“/”

     

字面匹配字符“*”

     

“”。匹配任何单个字符

     

“*?”在零和无限时间之间,尽可能少地扩展   根据需要(懒惰)

     

字面匹配字符“*”

     

字面匹配字符“/”

此外,通过添加(?s),这里是单行和多行注释的正则表达式:

//note the added \n which wont work with previous regex
String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("(?s)/\\*.*?\\*/","");
System.out.println(result);

<强>参考:

答案 2 :(得分:3)

无法直接在Java源代码中解析C / C ++样式注释。
带引号的字符串必须在同一正则表达式中同时解析
因为该字符串可能会嵌入/*//,所以它只是部分注释时的开始
的字符串。

请注意,如果原始字符串构造,则还需要更多正则表达式注意事项
语言是可能的。

执行此功能的正则表达式是这个。
其中组1包含 评论 ,组2包含 无评论
例如,如果您要删除评论,则为:

查找
(/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n|$))|("[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|[\S\s][^/"'\\]*)

替换
$2


字符串:
"(/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/|//(?:[^\\\\]|\\\\(?:\\r?\\n)?)*?(?:\\r?\\n|$))|(\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[\\S\\s][^'\\\\]*)*'|[\\S\\s][^/\"'\\\\]*)"

答案 3 :(得分:1)

尝试这个:

(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

如果要排除“”中包含的部分 然后使用:

(\"[^\"]*\"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

第一个捕获组标识所有“”部分,第二个捕获组为您提供注释(单行和多行)

如果需要解释,将正则表达式复制到regex101

答案 4 :(得分:0)

System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", ""));

你必须使用非贪婪量词?让正则表达式工作。 我还加了一个'?'在正则表达式的末尾删除一个空格。

答案 5 :(得分:0)

试试这对我有用:

System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));

答案 6 :(得分:0)

这可能是多行注释的最佳方法

System.out.println(text.replaceAll("\\/\\*[\\s\\S]*?\\*\\/", ""));