Java 中的非贪婪正则表达式

2022-09-03 01:37:54

我有下一个代码:

public static void createTokens(){
    String test = "test is a word word word word big small";
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+?\\s*)").matcher(test);
    while (mtch.find()){
        for (int i = 1; i <= mtch.groupCount(); i++){
            System.out.println(mtch.group(i));
        }
    }
}

并有下一个输出:

word
w

但在我看来,它必须是:

word
word

有人请解释一下为什么会这样?


答案 1

因为你的模式是非贪婪的,所以它们匹配尽可能少的文本,同时仍然由匹配组成。

删除 ?在第二组中,您将获得
单词
单词大小

Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+\\s*)").matcher(test);

答案 2

通过使用,它将匹配任意数量的空格,包括0个空格。 比赛。要确保它与以空格分隔的单词匹配,请尝试\\s*w(\\s*.+?\\s*)(\\s+.+?\\s+)