我有一个字符串,例如
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
字符串。
我尝试使用正则表达式,但由于经验不足而失败。
最好的多行注释正则表达式是一个展开的版本(?s)/\*.*?\*/
,看起来像
String pat = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/";
简而言之,
/\*
- 匹配评论开始/*
[^*]*\*+
- 匹配 0+ 个字符,而不是*
后跟 1+ 个文字*
(?:[^/*][^*]*\*+)*
- 0+ 序列:
[^/*][^*]*\*+
- 不是一个/
或*
(与 匹配[^/*]
)后跟 0+ 个非星号字符 ( [^*]*
) 后跟 1+ 个星号 ( \*+
)/
- 关闭/
David 的正则表达式需要26 个步骤才能在我的示例字符串中找到匹配项,而我的正则表达式只需要12 个步骤。对于大量输入,David 的正则表达式可能会因堆栈溢出问题或类似问题而失败,因为.*?
由于正则表达式引擎在每个位置执行的惰性模式扩展,惰性点匹配效率低下,而我的模式一次匹配线性文本块。
尝试使用这个正则表达式(仅限单行注释):
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);
参考:
试试这个:
(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)
如果要排除“”中包含的部分,请使用:
(\"[^\"]*\"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)
第一个捕获组标识所有“”部分,第二个捕获组为您提供评论(单行和多行)
如果需要解释,请将正则表达式复制到regex101
无法直接解析 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][^/\"'\\\\]*)"
System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", ""));
你必须使用非贪婪量词?让正则表达式工作。我还添加了一个“?” 在正则表达式的末尾删除一个空格。
试试这个对我有用的:
System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));
这可能是多行注释的最佳方法
System.out.println(text.replaceAll("\\/\\*[\\s\\S]*?\\*\\/", ""));