23

我有一个字符串,例如

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字符串。

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

4

7 回答 7

52

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

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

请参阅regex101.com 上的正则表达式演示和说明

简而言之,

  • /\*- 匹配评论开始/*
  • [^*]*\*+- 匹配 0+ 个字符,而不是*后跟 1+ 个文字*
  • (?:[^/*][^*]*\*+)*- 0+ 序列:
    • [^/*][^*]*\*+- 不是一个/*(与 匹配[^/*])后跟 0+ 个非星号字符 ( [^*]*) 后跟 1+ 个星号 ( \*+)
  • /- 关闭/

David 的正则表达式需要26 个步骤才能在我的示例字符串中找到匹配项,而我的正则表达式只需要12 个步骤。对于大量输入,David 的正则表达式可能会因堆栈溢出问题或类似问题而失败,因为.*?由于正则表达式引擎在每个位置执行的惰性模式扩展,惰性点匹配效率低下,而我的模式一次匹配线性文本块。

于 2016-03-31T09:06:36.303 回答
20

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

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);

正则表达式解释:

从字面上匹配字符“/”

从字面上匹配字符“*”

“。” 匹配任何单个字符

“*?” 零到无限次之间,尽可能少,按需扩展(懒惰)

从字面上匹配字符“*”

从字面上匹配字符“/”

或者,这里是通过添加(?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);

参考:

于 2012-10-22T15:46:48.943 回答
3

试试这个:

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

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

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

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

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

于 2018-08-21T06:21:33.550 回答
0

无法直接解析 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][^/\"'\\\\]*)"

于 2019-11-09T23:43:31.957 回答
-1
System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", ""));

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

于 2012-10-22T15:59:44.230 回答
-1

试试这个对我有用的:

System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));
于 2018-03-10T22:07:59.510 回答
-1

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

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

于 2019-11-04T06:23:33.057 回答