您好我正在尝试删除多行中/*
和*/
之间的所有代码。到目前为止我有这个:
Scanner scan = new Scanner(inputFile).useDelimiter("\\Z");
String file = scan.next();
String next = file.replaceAll("((/\\*)(\\s|\\S)*(\\*/))", "");
但是当我尝试使用包含/*
和*/
多个案例的输入文件来运行它时,它会删除它们之间的所有内容。例如,在此输入中
/* first comment */
a = b;
//test
if a = c;
// whatever
if a = d;
/* this
is a
test
*/
/* another */
它将删除文件末尾的第一个/*
和最后一个*/
之间的所有内容。基本上用空格替换整个文本。如何将其限制为/**
和**/
的第一种情况?
答案 0 :(得分:2)
您正在使用greedy
量词。您的(\\s|\\S)*
将匹配所有内容,直到找到最后一个*/
,直到可以成功匹配完整模式的结果。
您可以在?
之后添加*
,让量词不愿意。
"((/\\*)(\\s|\\S)*?(\\*/))"
此外,您可以像这样简化正则表达式: -
String next = file.replaceAll("(?s)/\\*.*?\\*/", "");
(?s)
- >用于SingleLine
匹配。它是Pattern.DOTALL
中使用String.replaceAll()
的替代方法。因此,您的dot(.)
会包含所有内容,包括换行符。而且你不需要(\\s|\\S)
。