\ b не совпадает, если предыдущий символ является границей слова
У меня довольно странная проблема. Я пытаюсь найти шаблон, подобный [some string][word boundary]
. Упрощенный, мой код:
final Pattern pattern = Pattern.compile(Pattern.quote(someString) + "\\b");
final String value = someString + " ";
System.out.println(pattern.matcher(value).find());
Моя логика говорит мне, что это всегда должно выводить true
, независимо от того, что someString
. Однако:
- Если
someString
заканчивается символом слова (например, "abc" ), выводится true
;Если
someString
заканчивается границей слова (например, "abc." ), выводится false
.Любые идеи, что происходит? Моим текущим обходным путем является использование \W
вместо \b
, но я не уверен в последствиях.
Точка, тогда пространство не является границей слов.
Граница слова находится между символом слова, затем неглавным символом или наоборот.
т.е. между [a-zA-Z0-9_][^a-zA-Z0-9_]
или [^a-zA-Z0-9_][a-zA-Z0-9_]
Граница слова - это неглавный символ, которому предшествует символ слова или наоборот. Пространство, которому предшествует период (2 символа без слов), не соответствует этому требованию.
Эффект использования \W
заключается в том, что любые неглавные символы будут совпадать (то же самое, что и \b
, но без условия, чтобы символу предшествовал символ слова), что кажется правильным для вашего примера.