java - 如何在不影响 Java 中的 URL 的情况下从字符串中删除所有注释

标签 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:

请帮我找出解决方案。

最佳答案

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

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

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

  1. 删除单行评论
  2. 删除多行注释
  3. 处理一些特殊情况

注意:处理正则表达式会花费很多时间。因此,如果需要性能,您应该检查其他解决方案 - 您自己的处理器或第三方库。

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

关于java - 如何在不影响 Java 中的 URL 的情况下从字符串中删除所有注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44582999/

相关文章:

Python 字符串列表和正则表达式列表,找到不匹配的字符串的干净方法?

java - 我的 main 方法采用的输入参数是什么?

java - 如何将 HTML 插入 Oracle 数据库

Java Scanner if/else 和 while 语句

python - 尝试在 Python 中搜索带有 (.*?) 的字符串

python - 正则表达式 : Match everything after a particular word

java - "How to fix error ' 表达式的非法开始”- java

java - J面板尺寸不正确

python - 使用正则表达式或 lxml 在 Python 中提取 HTML 注释?

php - 如何在 PHP 中用单个空格正确替换多个空格?