\ b не совпадает, если предыдущий символ является границей слова

79
9

У меня довольно странная проблема. Я пытаюсь найти шаблон, подобный [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, но я не уверен в последствиях.

спросил(а) 2012-07-04T16:12:00+04:00 7 лет, 5 месяцев назад
2
Решение
85

Точка, тогда пространство не является границей слов.

Граница слова находится между символом слова, затем неглавным символом или наоборот.

т.е. между [a-zA-Z0-9_][^a-zA-Z0-9_] или [^a-zA-Z0-9_][a-zA-Z0-9_]

ответил(а) 2012-07-04T16:21:00+04:00 7 лет, 5 месяцев назад
Еще 1 ответ
70

Граница слова - это неглавный символ, которому предшествует символ слова или наоборот. Пространство, которому предшествует период (2 символа без слов), не соответствует этому требованию.

Эффект использования \W заключается в том, что любые неглавные символы будут совпадать (то же самое, что и \b, но без условия, чтобы символу предшествовал символ слова), что кажется правильным для вашего примера.

ответил(а) 2012-07-04T16:18:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема