如何从字符串中删除所有注释而不影响java中的URL

时间:2017-06-16 07:10:43

标签: java regex

我需要从字符串中删除所有类型的注释,而不会影响该字符串中定义的URL。当我尝试使用正则表达式从字符串中删除注释时,URL的某些部分也会从字符串中删除。 我尝试了以下正则表达式,但同样的问题正在发生。

    String sourceCode= "/*\n"
                + " * Multi-line comment\n"
                + " * Creates a new Object.\n"
                + " */\n"
                + "public Object someFunction() {\n"
                + " // single line comment\n"
                + " Object obj =  new Object();\n"
                + " return obj; /* single-line comment */\n"
                + "}"
                + "\n"
                + "https://stackoverflow.com/questions/18040431/remove-comments-in-a-string";

    sourceCode=sourceCode.replaceAll("//.*|/\\*((.|\\n)(?!=*/))+\\*/", "");
    System.out.println(sourceCode);

但是无论如何评论都被删除了,但是输出显示如下

    public Object someFunction() {
        Object obj =  new Object();
        return obj; 
    }
    https:

请帮我找到解决方案。

3 个答案:

答案 0 :(得分:1)

[^:]//.*|/\\*((.|\\n)(?!=*/))+\\*/ 更改的前几个字符为[^:]。这意味着//之前的符号必须不是:

我通常使用regex101.com来处理正则表达式。为您的案例选择python语言(因为语言使用稍微不同的转义)。

这是人类阅读的非常复杂的正则表达式,因此另一个解决方案可能是使用几个简单的表达式并处理多个传递中的传入文本。像

  1. 删除单行评论
  2. 删除多行注释
  3. 处理一些特殊情况
  4. 注意:处理正则表达式需要花费很多时间。因此,如果需要性能,您应该检查另一个解决方案 - 您自己的处理器或第三方库。

    <强> EDITED 正如所建议的@Wiktor表达式[^:]//.*|/\\*((?!=*/)(?s:.))+\\*/是更快的解决方案。至少快2-3倍。

答案 1 :(得分:0)

您可以将字符串拆分为“\ n”并检查每一行。这是经过测试的代码:

String sourceCode= "/*\n"
            + " * Multi-line comment\n"
            + " * Creates a new Object.\n"
            + " */\n"
            + "public Object someFunction() {\n"
            + " // single line comment\n"
            + " Object obj =  new Object();\n"
            + " return obj; /* single-line comment */\n"
            + "}"
            + "\n"
            + "https://stackoverflow.com/questions/18040431/remove-comments-in-a-string";

String [] parts = sourceCode.split("\n");

System.out.println(getUrlFromText(parts));

以下是提取方法:

private static String getUrlFromText(String []parts) {
    for (String part : parts) {
        if(part.startsWith("http")) {
            return part;
        }
    }

    return null;
}

答案 2 :(得分:0)

更具体地说,这个EXP应该是

.*[^:]//.*|/\\*((.|\\n)(?!=*/))*\\*/

您提供的模式无法删除/**/部分代码(如果有特殊要求,那么就可以了)

所以您的EXP就像:
 enter image description here

它应该是:
enter image description here

为了更加了解visit并使用您的EXP .*[^:]\/\/.*|\/\*((.|\n)(?!=*\/))*\*\/,它会显示该图表。