квантификаторы регулярных выражений Java - PullRequest
7 голосов
/ 09 февраля 2012

У меня есть строка типа

String string = "number0 foobar number1 foofoo number2 bar bar bar bar number3 foobar";

Мне нужно регулярное выражение, чтобы дать мне следующий вывод:

number0 foobar
number1 foofoo
number2 bar bar bar bar
number3 foobar

Я пытался

Pattern pattern = Pattern.compile("number\\d+(.*)(number\\d+)?");
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
    System.out.println(matcher.group());
}

, ноэто дает

number0 foobar number1 foofoo number2 bar bar bar bar number3 foobar

Ответы [ 6 ]

10 голосов
/ 09 февраля 2012

Таким образом, вы хотите, чтобы number (+ целое число) следовало что-нибудь до следующего number (или конца строки), верно?

Тогда вам нужно сообщить это движку регулярных выражений:

Pattern pattern = Pattern.compile("number\\d+(?:(?!number).)*");

В вашем регулярном выражении .* соответствует как можно большему - все до конца строки.Также вы сделали вторую часть (number\\d+)? частью самого матча.

Объяснение моего решения:

number    # Match "number"
\d+       # Match one of more digits
(?:       # Match...
 (?!      #  (as long as we're not right at the start of the text
  number  #   "number"
 )        #  )
 .        # any character
)*        # Repeat as needed.
0 голосов
/ 23 декабря 2015
Pattern pattern = Pattern.compile("\\w+\\d(\\s\\w+)\1*");
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group());
}
0 голосов
/ 09 февраля 2012

Почему бы вам просто не сопоставить number\\d+, не запросить местоположение совпадения и не разбить строку самостоятельно?

0 голосов
/ 09 февраля 2012

(.*) часть вашего регулярного выражения является жадной, поэтому она съедает все от этой точки до конца строки.Изменить на не жадный вариант: (.*)?

http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

0 голосов
/ 09 февраля 2012

Если «foobar» является лишь примером, и вы действительно имеете в виду «любое слово», используйте следующий шаблон: (number\\d+)\s+(\\w+)

0 голосов
/ 09 февраля 2012

потому что .* - это жадный шаблон. используйте .*? вместо .*

Pattern pattern = Pattern.compile("number\\d+(.*?)(number\\d+)");
Matcher matcher = pattern.matcher(string);
while(matcher.find();){
    out(matcher.group());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...