Java 用新行数替换注释的正则表达式

Java 用新行数替换注释的正则表达式,java,regex,Java,Regex,我想用该注释的新行数替换所有Java风格注释(/**/)。到目前为止,我只能找到用空字符串替换注释的方法 String.replaceAll("/\\*[\\s\\S]*?\\*/", "") 是否可以用包含的新行数替换匹配的正则表达式?如果这仅仅是正则表达式匹配是不可能的,那么最好的方法是什么 比如说, /* This comment has 2 new lines contained within */ 将替换为仅包含两行新行的字符串。可能,此表达式 \/\*.*?\*\/ 在s上模式

我想用该注释的新行数替换所有Java风格注释(/**/)。到目前为止,我只能找到用空字符串替换注释的方法

String.replaceAll("/\\*[\\s\\S]*?\\*/", "")
是否可以用包含的新行数替换匹配的正则表达式?如果这仅仅是正则表达式匹配是不可能的,那么最好的方法是什么

比如说,

/* This comment
has 2 new lines
contained within */

将替换为仅包含两行新行的字符串。

可能,此表达式

\/\*.*?\*\/
s上
模式可能接近您的想法

试验 输出
如果您希望探索/简化/修改该表达式,它已被删除 在的右上面板上进行了说明 . 如果你愿意,你可以 也可以观看,它将如何匹配 对照一些样本输入



您可以使用正则表达式“替换循环”来完成

在Java 9+中最容易做到的是:

String result = Pattern.compile("/\\*(?:[^*]++|\\*(?!/))*+\\*/").matcher(input)
                       .replaceAll(r -> r.group().replaceAll(".*", ""));
主正则表达式已针对性能进行了优化。lambda尚未优化

对于所有Java版本:

Matcher m = Pattern.compile("/\\*(?:[^*]++|\\*(?!/))*+\\*/").matcher(input);
StringBuffer buf = new StringBuffer();
while (m.find())
    m.appendReplacement(buf, m.group().replaceAll(".*", ""));
String result = m.appendTail(buf).toString();
试验


由于Java支持
\G
构造,所以只需一次完成即可。
使用全局正则表达式替换函数

发现


“/(?:\\/\*(?=[\\S\\S]*?\\*\\/)\(?当您对包含例如
String comment=“/*这是一条注释”的代码运行程序时会发生什么情况*/"
?Regex对于该作业来说是错误的工具,您需要一个真正的Java解析器。@JimGarrison-Regex对于该作业来说不是错误的工具,它是除了语言解析器之外的唯一一个用于该作业的工具。Regex可以同时解析字符串和注释。这很简单,但不是必需的。我包括了一个解析引号的扩展Regex同时尝试。这是另一项被吉姆·加里森、维克托·斯特里比·埃夫、mpromonet昨天搁置的
所扼杀的先进技术。很遗憾,搜索答案的社区将看不到这一点。被搁置的想法相当狭隘,但现在看来越来越典型O.那肯定不行。你怎么知道用2替换呢?
\n
?你不知道,这就是为什么你错了,因为第二条评论中有3条,并且被错误地替换为2。因为结果不正确而被否决(aka not use)。
String result = Pattern.compile("/\\*(?:[^*]++|\\*(?!/))*+\\*/").matcher(input)
                       .replaceAll(r -> r.group().replaceAll(".*", ""));
Matcher m = Pattern.compile("/\\*(?:[^*]++|\\*(?!/))*+\\*/").matcher(input);
StringBuffer buf = new StringBuffer();
while (m.find())
    m.appendReplacement(buf, m.group().replaceAll(".*", ""));
String result = m.appendTail(buf).toString();
final String input = "Line 1\n"
                   + "/* Inline comment */\n"
                   + "Line 3\n"
                   + "/* One-line\n"
                   + "   comment */\n"
                   + "Line 6\n"
                   + "/* This\n"
                   + "   comment\n"
                   + "   has\n"
                   + "   4\n"
                   + "   lines */\n"
                   + "Line 12";

Matcher m = Pattern.compile("(?s)/\\*(?:[^*]++|\\*(?!/))*+\\*/").matcher(input);
String result = m.replaceAll(r -> r.group().replaceAll(".*", ""));

// Show input/result side-by-side
String[] inLines = input.split("\n", -1);
String[] resLines = result.split("\n", -1);
int lineCount = Math.max(inLines.length, resLines.length);
System.out.println("input                    |result");
System.out.println("-------------------------+-------------------------");
for (int i = 0; i < lineCount; i++) {
    System.out.printf("%-25s|%s%n", (i < inLines.length ? inLines[i] : ""),
                                    (i < resLines.length ? resLines[i] : ""));
}
 (?:
      / \* 
      (?= [\S\s]*? \* / )
   |  
      (?<! \* / )
      (?! ^ )
      \G 
 )
 (?:
      (?! \r? \n | \* / )
      . 
 )*
 (                             # (1 start)
      (?: \r? \n )?
 )                             # (1 end)
 (?: \* / )?
    (                             # (1 start)
         "
         [^"\\]* 
         (?:
              \\ [\S\s] 
              [^"\\]* 

         )*
         "
    )                             # (1 end)
 |  
    (?:
         / \* 
         (?= [\S\s]*? \* / )
      |  
         (?<! " )
         (?<! \* / )
         (?! ^ )
         \G 
    )
    (?:
         (?! \r? \n | \* / )
         . 
    )*
    (                             # (2 start)
         (?: \r? \n )?
    )                             # (2 end)
    (?: \* / )?