如何在java正则表达式中匹配注释块之间的文本?
我必须在如何在java正则表达式中匹配注释块之间的文本?,java,regex,Java,Regex,我必须在/*和*/之间匹配文本。这些是java块注释 目前,我创建的程序无法按预期工作,因为它不会在关闭令牌时停止。以下是代码: public static void main(String[] args) { String s = "public void /* sdksd\n*k/sss\\d\nsd */ main class\n/*String s = null;*/trtgg"; Matcher matcher = Pattern.compile("(?s)/\\*(.
/*
和*/
之间匹配文本。这些是java块注释
目前,我创建的程序无法按预期工作,因为它不会在关闭令牌时停止。以下是代码:
public static void main(String[] args) {
String s = "public void /* sdksd\n*k/sss\\d\nsd */ main class\n/*String s = null;*/trtgg";
Matcher matcher = Pattern.compile("(?s)/\\*(.*)(?=\\*/)").matcher(s);
while (matcher.find()) {
String group = matcher.group(1);
System.out.println("group="+group);
}
}
它打印:
group= sdksd
*k/sss\d
sd */ main class
/*String s = null;
预期产出为:
group= sdksd
*k/sss\d
sd
group=String s = null;
为什么它不在第一次关闭令牌时停止
是否有其他方法可以实现此目的?假设您不允许嵌套注释,如
/*外部注释/*嵌套注释*/外部注释*/
在Java中,可以使用非贪婪匹配:
/\\*.*?\\*/
或者为了避免非贪婪匹配(某些正则表达式没有):
如果允许嵌套注释,则生成的语言是非正则的,不能用真正的正则表达式来描述(即使使用Java的正则表达式,也可能是这样,因为它不是严格的正则表达式)。假设不允许嵌套注释,如
/*outer comment/*nested comment*/outer comment*/
在Java中,可以使用非贪婪匹配:
/\\*.*?\\*/
或者为了避免非贪婪匹配(某些正则表达式没有):
如果允许嵌套注释,则生成的语言是非正则的,不能用真正的正则表达式来描述(即使使用Java的正则表达式,也可能是这样,因为它不是严格正则的)。确实要使正则表达式引擎匹配
(?=\\*/)
在单个字符被*
使用后,您需要将*设置为惰性。
下面是正确的代码:
Matcher matcher = Pattern.compile("(?s)/\\*(.*?)(?=\\*/)").matcher(s);
实际上,要使正则表达式引擎在单个字符被
*
使用后匹配(?=\\*/)
,您需要将*设置为惰性。
下面是正确的代码:
Matcher matcher = Pattern.compile("(?s)/\\*(.*?)(?=\\*/)").matcher(s);
*
是贪婪的,所以你需要使用*?
来使它懒惰。不过,注释提取可能相当棘手。请使用。完成匹配所需的步骤是Jiri建议的最佳步骤的4倍多。*
是贪婪的,因此需要使用*?
使其变得懒惰。不过,注释提取可能相当棘手。请使用。完成比赛所需的步骤是Jiri建议的最佳步骤的4倍多。