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

时间:2019-09-05 21:04:28

标签: java regex

我想用该注释的新行数替换所有Java样式的注释(/ * * /)。到目前为止,我只能提出一些用空字符串替换注释的内容

String.replaceAll("/\\*[\\s\\S]*?\\*/", "")

是否可以将匹配的正则表达式替换为其中包含的新行数?如果仅使用正则表达式匹配是不可能的,那么最好的方法是什么?

例如,

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

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

3 个答案:

答案 0 :(得分:2)

由于Java支持\G构造,因此只需一次完成所有操作。
使用全局正则表达式替换功能。

查找

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

替换

"$1"

https://regex101.com/r/l1VraO/1

扩展

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

============================================= ======
=============================================== ===

如果您应该关心在内部开始的注释块分隔符
引用这样的字符串

String comment = "/* this is a comment*/"

这里是一个正则表达式(加法),用于解析带引号的字符串以及注释。
仍然可以在一个正则表达式中一次全部在全局查找/替换中完成。

查找

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

替换

"$1$2"

https://regex101.com/r/tUwuAI/1

扩展

    (                             # (1 start)
         "
         [^"\\]* 
         (?:
              \\ [\S\s] 
              [^"\\]* 

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

答案 1 :(得分:1)

您可以使用正则表达式“替换循环”来实现。

在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();

测试

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] : ""));
}

输出

input                    |result
-------------------------+-------------------------
Line 1                   |Line 1
/* Inline comment */     |
Line 3                   |Line 3
/* One-line              |
   comment */            |
Line 6                   |Line 6
/* This                  |
   comment               |
   has                   |
   4                     |
   lines */              |
Line 12                  |Line 12

答案 2 :(得分:0)

也许这个表情

\/\*.*?\*\/
s模式下

可能与您所想的很接近。

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class re{

    public static void main(String[] args){

        final String regex = "\\/\\*.*?\\*\\/";
        final String string = "/* This comment\n"
             + "has 2 new lines\n"
             + "contained within */\n\n"
             + "Some codes here 1\n\n"
             + "/* This comment\n"
             + "has 2 new lines\n"
             + "contained within \n"
             + "*/\n\n\n"
             + "Some codes here 2";
        final String subst = "\n\n";

        final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
        final Matcher matcher = pattern.matcher(string);

        final String result = matcher.replaceAll(subst);

        System.out.println(result);

    }
}

输出

Some codes here 1






Some codes here 2

  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。