Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java正则表达式中匹配注释块之间的文本?_Java_Regex - Fatal编程技术网

如何在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倍多。