Нежадное регулярное выражение в Java - PullRequest
10 голосов
/ 19 января 2012

У меня есть следующий код:

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 ]

11 голосов
/ 19 января 2012

Поскольку ваши шаблоны не являются жадными, поэтому они соответствуют как можно меньшему количеству текста, в то же время все еще состоят из соответствия.

Удалить? во второй группе, и вы получите
слово
слово слово большой маленький

Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+\\s*)").matcher(test);
3 голосов
/ 19 января 2012

Используя \\s*, он будет соответствовать любому количеству пробелов, включая 0 пробелов. w соответствует (\\s*.+?\\s*). Чтобы убедиться, что оно соответствует слову, разделенному пробелами, попробуйте (\\s+.+?\\s+)

...