2014-10-10 4 views
0

Я хотел бы извлечь из текста длину 3-5. Образец ниже работает для всех моих случаев.Проверьте, не является ли результат уникальным

Pattern pattern = Pattern.compile("(^|[\\D]|.*[\\D])(?<number>[0-9]{3,5})($|[\\D]|[\\D].*)"); 

    //Working examples always returns 111 
    //Matcher m = pattern.matcher("XX 111, YYY 37124091"); 
    //Matcher m = pattern.matcher("XX 111"); 
    //Matcher m = pattern.matcher("X111"); 
    //Matcher m = pattern.matcher("111"); 

Единственная проблема, которую я получил, когда картина, как я полагаю, должен найти несколько матчей, как на примере ниже (111, 123), вместо этого он возвращает только 123

Matcher m = pattern.matcher("XX 111, CCC 123 YYY 37124091"); 

    while(m.find()){ 
     System.out.println(m.group("number"); 
    } 

Как я могу что шаблон соответствует совпадению 2 раза или почему он не подходит для 111 и 123?

+0

Вы используете Java 7? – sln

+0

@sln да действительно использование новейший 1.7. – MortalFool

ответ

1

Единственная проблема, которую я получил, когда картина, как я полагаю, должен найти несколько матчей, как на примере ниже (111, 123), вместо этого он возвращает только 123

Вам нужно сделать * квантор неохотно, а не жадный.

Для данных

XX 111, CCC 123 YYY 37124091 

.*\\D часть будет в состоянии соответствовать

"XX 111, CCC " 
^---------^^ 
     |  | 
    .* \\D 

потребляя 111.

Try изменения

Pattern.compile("(^|\\D|.*\\D)(?<number>[0-9]{3,5})($|\\D|\\D.*)"); 

в

Pattern.compile("(^|\\D|.*?\\D)(?<number>[0-9]{3,5})($|\\D|\\D.*?)"); 
//add these    ^         ^

Также \\D сам класс символов, так что вам не нужно, чтобы окружить его [..]. Другими словами, вам не нужно писать его как [\\D], достаточно простого \\D.


Как я могу определить, что шаблон сделал матч 2 раза

Regex не будет помнить все ранее согласованные результаты. Если вы хотите получить только уникальные значения, сохраните их в Set.

3

Просто измените его на ленивый квантор.

# "(^|[\\D]|.*?[\\D])(?<number>[0-9]{3,5})($|[\\D])" 

(         # (1 start) 
    ^
    | [\D] 
    | .*? [\D] 
)         # (1 end) 
(?<number>       # (2 start) 
     [0-9]{3,5} 
)         # (2 end) 
(         # (3 start) 
     $ 
    | [\D] 
)         # (3 end) 

Выход:

** Grp 0 - (pos 0 , len 7) 
XX 111, 
** Grp 1 - (pos 0 , len 3) 
XX 
** Grp 2 - (pos 3 , len 3) 
111 
** Grp 3 - (pos 6 , len 1) 
, 

----------------- 

** Grp 0 - (pos 7 , len 9) 
CCC 123 
** Grp 1 - (pos 7 , len 5) 
CCC 
** Grp 2 - (pos 12 , len 3) 
123 
** Grp 3 - (pos 15 , len 1) 
-1

Для определения количества 4:57 цифр, вы хотите использовать что-то вроде этого \b[1-9]\d{2,4}\b

+2

Не отвечает на вопрос, но может быть полезным комментарием. – Sam

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