2015-12-25 3 views
1

Привет Я пытаюсь сделать regex в java, мне нужно записать последние слова {n}. (Между словами может быть переменное число пробелов). Требование - это нужно делать в регулярном выражении. Так, например, вRegex in Java: Capture last {n} words

The man is very tall. 

При п = 2, мне нужно, чтобы захватить

very tall. 

Так что я попытался

(\S*\s*){2}$ 

Но это не соответствует в Java, поскольку начальные слова должны быть потреблен первым , Поэтому я пробовал

^(.*)(\S*\s*){2}$ 

Но. * Потребляет все, а последние 2 слова игнорируются. Я также попытался

^\S?\s?(\S*\s*){2}$ 

Каждый знает способ обойти это, пожалуйста?

+0

Пожалуйста, поделитесь код, это трудно понять, что вы до из примеров. Я думаю, вам нужно «var rx =» (? S)^(. *?) (\\ S + \\ s *) {2} $ ", если вы используете' String # matches'. –

+2

Пожалуйста, разместите полный код. –

+0

Просьба дать некоторые ответы на ответы. –

ответ

1

Вы почти получили его с первой попытки.

Просто измените + на *.

Знак «плюс» означает хотя бы один символ, потому что не было места, в котором матч потерпел неудачу.

С другой стороны, звездочка означает от нуля до более, поэтому она будет работать.

Посмотрите, что здесь живет: (?:\S*\s*){2}$

Используя replaceAll метод, вы можете попробовать это регулярное выражение: ((?:\\S*\\s*){2}$)|.

+0

Хороший улов, но он все равно не соответствует ... ему нужны начальные символы, которые нужно указать/использовать. – user2689782

+0

Извините, я не понял, вы можете показать правильный результат? –

+0

См. Выше, мне нужно захватить «очень высокий». Со всеми промежутками между ними (которые этот редактор не позволяет) – user2689782

1

Your regex содержит - как вы уже упомянуть - жадный подшаблон, что съедает всю строку и синус (\S*\s*){2} могут совпадение с пустой строкой, оно соответствует пустому месту в конце строки ввода.

Ленивый соответствие точка (изменение .* к .*?) won't do the whole job поскольку группа захвата количественно, и Matcher.group(1) будет установлен на последних захваченных не-пробельных символов с дополнительными пробелами. Вам нужно настроить группу захвата вокруг определенной группы.

Поскольку вы, скорее всего, используют Matcher#matches, вы можете использовать

String str = "The man is very tall."; 
Pattern ptrn = Pattern.compile("(.*?)((?:\\S*\\s*){2})"); // no need for `^`/`$` with matches() 
Matcher matcher = ptrn.matcher(str); 
if (matcher.matches()) {     // Group 2 contains the last 2 "words" 
    System.out.println(matcher.group(2)); // => very tall. 
} 

См IDEONE demo

+0

Пожалуйста, проверьте мой ответ и дайте мне знать, если что-то неясно. –