2015-09-11 3 views
2

Я боюсь понять простой regex. Я googled вокруг. как-то это не поражает меня.regex соответствующий шаблон в java

Вот метод:

public static void testMethod(){ 
     String line = "This order was placed for QT3000! OK?"; 
     String pattern = "(.*)(\\d+)(.*)"; 

     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(line); 
     if (m.find()) { 
      System.out.println("Found value: " + m.group(0)); 
      System.out.println("Found value: " + m.group(1)); 
      System.out.println("Found value: " + m.group(2)); 
      System.out.println("Found value: " + m.group(3)); 
     } 
    } 

Вот результат:

Я ожидал group(2) для печати 3000. но почему он печатает только 0.

ответ

6

Группа 2 захваченного текста содержит только 0 из-за первого жадного .*. Он соответствовал последней цифре, и пусть \d+ имеют только последнюю цифру. См. demo of your regex.

Чтобы исправить это, используйте ленивое соответствие точка:

(.*?)(\d+)(.*) 
^

См another demo

+0

См. [* Остерегайтесь жадности! *] (Http://www.regular-expressions.info/repeat.html#greedy) и [* Жадная ловушка *] (http: //www.rexegg. com/regex-quantifiers.html # greedytrap) для подробного описания того, как backtracking работает с жадными и ленивыми кванторами. Я просто попытался вкратце объяснить корень проблемы и один возможный способ ее исправления. Разумеется, в зависимости от того, что вам нужно, вы можете использовать отрицательный класс символов (например, '[^ 0-9] *') или умеренный токен. –

2

Вам нужно ([^0-9.]*)(\\d+)(.*).

Первая группа, сопоставляющая все до последнего нуля, так как у вас есть + во второй группе. Вам нужно избегать номеров из первой группы.

Смежные вопросы