剥线注释而不是网址

时间:2014-03-25 18:54:43

标签: java

假设我们想要预处理JSON字符串以去掉C样式行注释。一个例子可能看起来

像这样:

// this is a comment

{ // another comment

 true, "foo", // 3rd comment

 "http://www.abc.com" // comment after URL

}

编写一个删除行注释的函数。

我尝试过使用正则表达式:

replaceAll("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)","")

这会删除网址,我输出为:

  { 
 true,foo , 
http:
}

我想要网址,即我希望我的输出为   {  是的,foo, http://www.abc.com }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

问题是,在正则表达式(?://.*)的最后一个条款中,您在//上匹配,但您想要做的是匹配//但不在://上}。

一旦解决方案是用这样的夫妇替换你的规则:

a)当前面有非//字符时匹配:[^:]//.*

b)匹配//,如果它位于一行的开头:^//.*

试试这个:

    String input = "// this is a comment\r\n" + 
            "\r\n" + 
            "{ // another comment\r\n" + 
            "\r\n" + 
            " true, \"foo\", // 3rd comment\r\n" + 
            "\r\n" + 
            " \"http://www.abc.com\" // comment after URL\r\n" + 
            "\r\n" + 
            "}";

    System.out.println(input.replaceAll("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|[^:]//.*|^//.*",""));