如何使用正则表达式来抑制单行和多行注释?

时间:2012-05-14 09:26:42

标签: java regex string

我需要在字符串中找到所有多行注释,并用空格(如果注释在一行中)或用\n替换它们(如果注释在多行上)。 例如:

int/* one line comment */a;

应更改为:

int a;

和此:

int/* 
more
than one
line comment*/a;

应更改为:

int
a;

我有一个包含所有文本的字符串,我使用了这个命令:

file = file.replaceAll("(/\\*([^*]|(\\*+[^*/]))*\\*+/)"," ");

其中file是字符串。

问题是它找到所有多行注释,我想将它分成2个案例。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

这可以使用Matcher.appendReplacementMatcher.appendTail来解决。

String file = "hello /* line 1 \n line 2 \n line 3 */"
            + "there /* line 4 */ world";

StringBuffer sb = new StringBuffer();
Matcher m = Pattern.compile("(?m)/\\*([^*]|(\\*+[^*/]))*\\*+/").matcher(file);

while (m.find()) {

    // Find a comment
    String toReplace = m.group();

    // Figure out what to replace it with
    String replacement = toReplace.contains("\n") ? "\n" : "";

    // Perform the replacement.
    m.appendReplacement(sb, replacement);
}

m.appendTail(sb);

System.out.println(sb);

<强>输出:

hello 
there  world

注意:如果您想在评论中的所有文本中保留正确的行号/列(如果您想要参考以下的源代码,那就太好了)错误消息等)我建议做

String replacement = toReplace.replaceAll("\\S", " ");

用白色空格替换所有非空白。这样\n保留,

"/* abc */"

替换为

"         "