Java正则表达式 - 在字符串内注释检测器

时间:2016-01-05 07:09:04

标签: java regex string comments

如何使用正则表达式注释检测,但如果在字符串内部它应该不起作用。
例如:

//----------------------example-----------------------------------------
class fo{
    void foo(){
        /***print comment
        */
        System.out.println("example writing comment // this is comment");
        System.out.println("example comment 1 /* comment1 */");
        System.out.println("example comment 2 /* comment2 "+
                           "*/");
    }
}

这里是我的评论检测模式:

Pattern.compile("^([^\"]|\"[^\"]*\")*?((/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(//.*))");

但它不起作用

所以,它应该是// this is comment,/ * comment1 * /,/* comment2 "+ "*/"必须不匹配。

2 个答案:

答案 0 :(得分:1)

您可以通过注意注释必须以零或更多“单位”的序列开头来解决此问题,您可以将单位定义为:

  • "
  • 以外的单个字符
  • 字符串文字,"后跟零个或多个非引号字符,后跟"

所以应该制作模式

"^([^\"]|\"[^\"]*\")*?((/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(//.*))"

我所做的是在您的模式之前

^([^"]|"[^"]*")*?

(当然,我必须逃避"个字符)。这意味着字符串以0或更多“单位”开头,正如我在上面定义的那样。最后一个*?表示我们匹配最小可能的单位数,以便我们找到其中一个单位之后的第一个注释。

第一个^是将模式锚定到字符串开头所必需的,以确保匹配器不会尝试在字符串文字内启动匹配。我相信您可以使用\\G代替^,因为\\G表示“输入的开始”。如果您尝试重复模式匹配并在字符串中查找所有注释,那将更有效。

注意:我已经对此进行了测试,似乎有效。

注2:由此产生的正则表达式非常难看。在StackOverflow上非常流行,认为正则表达式可以解决所有可能的问题,包括找到治愈癌症的方法;但是当结果像这样不可读时,是时候开始询问使用像循环这样无聊的东西是否更简单,更易读,更可靠。我不认为正则表达式更有效率,尽管我还没有检查过它。

答案 1 :(得分:-1)

您创建的正则表达式表达式中缺少一些转义字符,尽管这可能与您尝试执行的操作不符。这是您的更正版本。 Pattern.compile("((\\/\\*([^\\*]|(\\*(?!\\/))+)*\\+\\*\\+\\/)|(\\/\\/.*))");

但是,如果您要在IDE中使用替换正则表达式,请使用\".*?(\/\/.*?)\"并将组$1替换为空字符串。

如果您想使用Java替换字符串,请尝试以下操作:

Pattern p = Pattern.compile("(.*?)(\\/\\/.*?)");
String output = "";
String input = "example writing comment // this is comment";
Matcher m = p.matcher(input);
if (m.find())
    output = m.replaceFirst("$1");

修改

根据您的新问题,我提供了以下答案。但是,你的问题仍然不清楚。

Pattern p = Pattern.compile("^((.*?)((\\/\\/.*?)|(\\/\\*(.*)\\*\\/)(.*))?)$");
String output = "";
String input = "example writing comment // this is comment";
Matcher m = p.matcher(input);
if (m.find())
    output = m.replaceAll("$2$7");

此示例将替换字符串,如下所示:

  • "example writing comment // this is comment"
    • 撰写评论的示例
  • "example comment 1 /* comment1 */"
    • 示例评论1
  • "example comment 2 /* comment2 "
    • 示例评论2 / * comment2