Как найти точное слово с использованием регулярного выражения в Java? - программирование
Подтвердить что ты не робот

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

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

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

Выход

false

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

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

Спасибо заранее.

4b9b3361

Ответ 1

Когда вы используете метод 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() несколько раз, чтобы извлечь их все.

Ответ 2

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

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);
}

Объясняю:

  • (? i) - ignorecase
  • . *? - разрешить (по возможности) любые символы перед
  • \b - граница слова
  • % s - переменная, которая должна быть изменена с помощью String.format(цитируется во избежание регулярного выражения ошибки)
  • \b - граница слова
  • . *? - разрешить (по возможности) любые символы после

Ответ 3

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

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

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

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

Ответ 4

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

A(B(C))D

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

  • 0-я группа - ABCD
  • 1-я группа - BC
  • Вторая группа - 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));

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

Ответ 5

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

Ответ 6

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

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