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