Границы слов с несловесными символами - PullRequest
1 голос
/ 05 мая 2019

С выражением соответствия регулярному выражению
\b.*#\b
, почему эти два примера соответствуют приведенным ниже (выделено):

a #b # c #

a #b #c # d

В частности, почему первая строка не соответствует, содержит все до последнего #?

Поскольку граница слова (\ b) - это совпадение нулевой ширины, которое может совпадать между символом слова (\ w) и несловесным символом (\ W) или между символом слова и началом или концомиз строки, я не уверен, как окончание выражения, не содержащего слова, повлияет на совпадение.

Ответы [ 3 ]

1 голос
/ 05 мая 2019

В первой строке a #b #c #
нет границы слова a #b #c # <-here и -> EOS

, поэтому \b.*#\b соответствует a #b # c #, потому что
тамграница слова между a #b # <- здесь и здесь -> c #


На втором a #b #c #d это больше совпадающая проблема
первая и граница слова вторая.
Он должен соответствовать границе слова после #,
, поэтому он находит его между a #b #c # <- здесь и здесь -> d


Границы слова сначала непросты,
но если вы используете фразу, вы никогда не будете смущены ими снова.

1 голос
/ 05 мая 2019

Вот ваше текущее регулярное выражение:

\b.*#\b

А вот первый пример ввода:

a #b #c #
^^^^^^      <-- last word boundary is here

Первая граница слова на самом деле имеет место перед начальной a. Тогда .* будет жадно потреблять все до тех пор, пока не будет last #, за которым следует граница слова. Как вы цитировали, между словом и несловесным символом возникает граница слова, или наоборот. В последний раз это происходит #c, поскольку за последним # (с учетом того, что # является , а не символом слова) не следует символ слова.

Если вы просто хотите захватить все слова, оканчивающиеся на #, просто используйте это:

[^# ]+#

Демо

0 голосов
/ 05 мая 2019

\ b Может соответствовать только буквам, цифрам, подчеркиванию, китайским иероглифам. Жаль, что # в нем нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...