Я пытаюсь проверить, содержит ли строка слово в целом, используя Java. Ниже приведены некоторые примеры:

Text : "A quick brown fox"
Words:
"qui" - false
"quick" - true
"quick brown" - true
"ox" - false
"A" - true

Ниже мой код:

String pattern = "\\b(<word>)\\b";
String s = "ox";
String text = "A quick brown fox".toLowerCase();
System.out.println(Pattern.compile(pattern.replaceAll("<word>", s.toLowerCase())).matcher(text).find());

Он отлично работает со строками, подобными той, что я упоминал в примере выше. Однако я получаю неправильные результаты, если во входной строке есть символы, такие как %, ( и т. Д., Например:

Text : "c14, 50%; something (in) bracket"
Words:
"c14, 50%;" : false
"(in) bracket" : false

Это как-то связано с моим шаблоном regex (или, возможно, я неправильно выполняю сопоставление всего шаблона). Кто-нибудь может предложить мне лучший подход.

6
Darshan Mehta 20 Мар 2017 в 16:04

2 ответа

Лучший ответ

Похоже, вы хотите соответствовать только словам, заключенным в пробел (или в начале / конце строк).

Использование

String pattern = "(?<!\\S)" + Pattern.quote(word) + "(?!\\S)";

Отрицательный просмотр (?<!\S) не выполнит все совпадения, которым непосредственно предшествует символ, отличный от пробела, а (?!\s) - отрицательный запрос, который провалит все совпадения, за которыми сразу следует символ, отличный от пробела. Pattern.quote() необходим для экранирования специальных символов, которые должны рассматриваться как буквенные символы в шаблоне регулярных выражений.

6
Wiktor Stribiżew 20 Мар 2017 в 13:47

Попробуйте экранировать специальные символы с помощью обратной косой черты. Они могут иметь другие значения в шаблоне.

Небольшое исправление: Возможно, вам даже понадобится два обратного слэша, так как сам обратный слеш - это специальный символ в строке.

0
findusl 20 Мар 2017 в 13:08