Тот факт, что \w
соответствует подчеркиванию вместе с заглавными и строчными буквами, является историческим: это связано с тем, что он был впервые введен для соответствия идентификаторам C.
Что ж, это верно для Java\w
(да, \w
не будет соответствовать выделенным символам в Java).
\b
однако является якорем, и оно не определяется границей между тем, что являетсясимвол слова и не слово, фактически это зависит от реализации.
На самом деле нет привязки, которая делает то, что вы хотите, но если вы хотите сопоставить слова и тире, ваша лучшая ставка - \w*(-\w*)*
.
Опять же, шаблон normal* (special normal*)*
!
(и, кстати, \b
является «якорем для слов» только в некоторых диалектах, другие реализации определяют \<
и \>
вместо этого для начала и конца якоря слова соответственно)
[редактировать для грубой ошибки]