2

嗨,我正在尝试删除一串多行/*之间的所有代码。*/到目前为止我有这个:

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 */

它将删除文件末尾第一个/*和最后一个之间的所有内容。*/基本上用空格替换整个文本。如何将其限制为/**and的第一种情况**/

4

1 回答 1

3

您正在使用greedy量词。您(\\s|\\S)*将匹配所有内容,直到找到最后一个*/,直到可以成功匹配完整模式的结果。

?您可以通过添加after使量词不情愿*

"((/\\*)(\\s|\\S)*?(\\*/))"

此外,您可以像这样简化您的正则表达式: -

String next = file.replaceAll("(?s)/\\*.*?\\*/", "");

(?s)-> 用于SingleLine匹配。它是Pattern.DOTALL用于String.replaceAll(). 因此,您dot(.)将包括所有内容,包括换行符。你不需要(\\s|\\S)那个。

于 2012-11-08T07:17:14.840 回答