2012-02-27 3 views
16

Рассмотрим следующий фрагмент кода:Как найти точное слово с использованием регулярного выражения в Java?

String input = "Print this"; 
System.out.println(input.matches("\\bthis\\b")); 

Выходной

false 

Что может быть, возможно, не так с этим подходом? Если это неправильно, то какое правильное решение найти точное совпадение слов?

PS: Я нашел множество подобных вопросов здесь, но ни один из них не обеспечил решение, которое я ищу. Это прямая проблема, для которой я не смог найти правильное решение.

Заранее спасибо.

ответ

25

Когда вы используете метод matches(), он пытается сопоставить весь ввод. В вашем примере вход «Распечатать это» не соответствует шаблону, потому что слово «Печать» не соответствует.

Так что вам нужно добавить что-то в регулярное выражение, чтобы оно соответствовало начальной части строки, например.

.*\\bthis\\b 

И если вы хотите, чтобы дополнительный текст в конце строки тоже:

.*\\bthis\\b.* 

В качестве альтернативы, используйте Matcher объект и использовать Matcher.find() найти матчи в входной строки:

Pattern p = Pattern.compile("\\bthis\\b"); 
    Matcher m = p.matcher("Print this"); 
    m.find(); 
    System.out.println(m.group()); 

Выход:

this 

Если вы хотите найти несколько совпадений в строке, вы можете позвонить find() и group() несколько раз, чтобы извлечь их все.

4

Для хорошего объяснения, см: http://www.regular-expressions.info/java.html

myString.matches («регулярные выражения») возвращает истину или ложь в зависимости ли строка может быть полностью соответствует регулярному выражению. Важно помнить, что String.matches() возвращает true только в том случае, если можно сопоставить целую строку . Другими словами: «regex» применяется как , вы написали «^ regex $» с началом и концом привязок строк. Этот отличается от большинства других библиотек регулярных выражений, где метод «быстрого совпадения » возвращает значение true, если регулярное выражение может быть сопоставлено в любом месте строки . Если myString - abc, myString.matches ("bc") возвращает false. bc соответствует abc, но^bc $ (который действительно используется здесь) не делает.

Об этом пишет "истинный":

String input = "Print this"; 
System.out.println(input.matches(".*\\bthis\\b")); 
2

Вы можете использовать группы, чтобы найти точное слово. Regex API задает группы по круглым скобкам.Например:

A(B(C))D

Это утверждение состоит из трех групп, которые индексируются с 0.

  • 0th группа - ABCD
  • первая группа - BC
  • вторая группа - C

Так что если вам нужно найти какое-то конкретное слово, вы можете использовать два метода: i п Matcher класса, таких как: find() найти заявление указано регулярное выражение, а затем получить String объекта, определенного по номеру группы:

String statement = "Hello, my beautiful world"; 
Pattern pattern = Pattern.compile("Hello, my (\\w+).*"); 
Matcher m = pattern.matcher(statement); 
m.find(); 
System.out.println(m.group(1)); 

выше код результата будет «красивый»

+0

'find()' возвращает логическое значение, указывающее, было ли совпадение выполнено или нет. Вы должны * никогда не называть 'find()' и игнорировать результат. То же для 'matches()' и 'lookAt()'. Кроме того, номера групп индексируются от одного, а не от нуля. Первая «группа», «группа (0)», является искусственной, представляющей весь матч. –

1

ли ваш searchString собирается должно быть постоянное выражение? если не просто использовать String.contains(CharSequence s)

+1

Имейте в виду, что когда вы передаете '' this ''' 'методу' contains', он также возвращает true, если строка ввода '' isthisnice "' без пробелов. Поэтому вы не знаете, если совпадение является точным словом. –

8

Полный пример метод совпадений:

public static String REGEX_FIND_WORD="(?i).*?\\b%s\\b.*?"; 

public static boolean containsWord(String text, String word) { 
    String regex=String.format(REGEX_FIND_WORD, Pattern.quote(word)); 
    return text.matches(regex); 
} 

Объясните: (? я)

  1. - IGNORECASE
  2. *.? - разрешить (optinally) любые символы перед
  3. \ б - граница слова
  4. % S - переменная должна быть изменена с помощью string.Format (кавычки, чтобы избежать Regex ошибок)
  5. \ б - граница слова
  6. . *? - разрешить (по желанию) любые символы после
+0

'. *' Уже _any символ ноль или больше раз, поэтому вам не нужно '?'. –

0

System.out.println (input.matches (". * \\ bthis $"));

Также работает. Здесь. * Соответствует чему-либо перед пространством, а затем в конце оно соответствует слову.

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