Как найти точное слово с использованием регулярного выражения в Java?
Рассмотрим следующий фрагмент кода:
String input = "Print this";
System.out.println(input.matches("\\bthis\\b"));
Выход
false
Что может быть неправильным в этом подходе? Если это неправильно, то какое правильное решение найти точное совпадение слов?
PS: Я нашел множество подобных вопросов здесь, но ни один из них не обеспечил решение, которое я ищу. Это прямая проблема, для которой я не смог найти правильное решение.
Спасибо заранее.
Ответы
Ответ 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 $." );
Также работает. Здесь. * Соответствует чему-либо перед пространством, а затем в конце этого слова соответствует слово.