我有一个字符串,例如
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
个子字符串。
我尝试使用正则表达式但由于经验不足而失败。
答案 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]*?\\*\\/", ""));