Как найти точное слово, используя регулярное выражение в Java? - PullRequest
20 голосов
/ 27 февраля 2012

Рассмотрим следующий фрагмент кода:

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

выход

false

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

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

Ответы [ 6 ]

36 голосов
/ 27 февраля 2012

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

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

.*\\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() несколько раз, чтобы извлечь их все.

9 голосов
/ 20 сентября 2014

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

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. (? I) - без учета регистра
  2. . *? - разрешить (произвольно) любые символы до
  3. \ b - граница слова
  4. % s - переменная, которая будет изменена в String.format (в кавычках, чтобы избежать регулярных выражений ошибки)
  5. \ b - граница слова
  6. . *? - разрешить (произвольно) любые символы после
4 голосов
/ 27 февраля 2012

Хорошее объяснение см .: http://www.regular -expressions.info / java.html

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

Это пишет "true":

String input = "Print this";
System.out.println(input.matches(".*\\bthis\\b"));
3 голосов
/ 27 февраля 2012

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

A(B(C))D

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

  • 0-я группа - ABCD
  • 1-я группа - БК
  • 2-я группа - C

Поэтому, если вам нужно найти какое-то конкретное слово, вы можете использовать два метода в классе 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));

Приведенный выше код будет "красивым"

1 голос
/ 27 февраля 2012

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

0 голосов
/ 07 августа 2015

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

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

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