2012-06-06 6 views
1

Почему этот код:Почему этот код работает неправильно?

String keyword = "pattern"; 
String text = "sometextpatternsometext"; 
String patternStr = "^.*" + keyword + ".*$"; // 
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher(text); 
while (matcher.find()) { 
    int start = matcher.start(); 
    int end = matcher.end(); 
    System.out.println("start = " + start + ", end = " + end); 
} 

начало = 0, конец = 23

не работают должным образом.

Но этот код:

String keyword = "pattern"; 
String text = "sometext pattern sometext"; 
String patternStr = "\\b" + keyword + "\\b"; // 
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher(text); 
while (matcher.find()) { 
    int start = matcher.start(); 
    int end = matcher.end(); 
    System.out.println("start = " + start + ", end = " + end); 
} 

старт = 9, конец = 16

отлично работает.

+0

+1 хорошо структурированный вопрос, конкретный, со всеми соответствующими деталями. –

ответ

8

It . произведение. Ваш шаблон

^.*pattern.*$ 

говорит, что нужно:

  1. старт в начале
  2. принять любое количество символов
  3. следуют строки pattern
  4. с последующим любым количеством символов
  5. до конца строки

В результате получается вся строка ввода. Если бы вы хотели найти только слово pattern, то регулярное выражение было бы просто словом само по себе или, как вы нашли, заключенным в квадратные скобки с метасимволами с символами слова.

4

Дело не в том, что первый пример не сработал, это значит, что вы случайно попросили его соответствовать больше, чем вы имели в виду.

Выражения .* расширяются, чтобы содержать все символы перед «шаблоном» и всеми символами после шаблона, поэтому все выражение соответствует всей строке.

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

1

Проблема в своем регулярном выражении: "^.*" + keyword + ".*$"

Выражение .* матчи столько символов, сколько есть в строке. Это означает, что он фактически соответствует цельной строке. После целой строки он не может найти ваше ключевое слово.

Чтобы сделать это работает, то вы должны сделать его жадным, то есть добавить знак вопроса после .*:

"^.*?" + keyword + ".*$"

Этого время .*? Удачных минимум символов с последующих ключевым словом.

+0

'Чтобы заставить его работать, вы должны сделать его жадным, т. Е.добавить знак вопроса после. * 'Вы имеете в виду не жадные права? – anubhava

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