Java中的非贪婪正则表达式

时间:2012-01-19 18:16:24

标签: java regex non-greedy

我有下一个代码:

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

有人请解释我为什么这样?

2 个答案:

答案 0 :(得分:11)

因为你的模式不是贪婪的,所以它们尽可能地匹配尽可能少的文本,同时仍然包含匹配。

删除?在第二组,你会得到 字
单词大小

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

答案 1 :(得分:3)

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