Похоже, что вы правы: \b
работает так, как ожидалось, в прогнозе, но в прогнозе это рассматривается как синтаксическая ошибка.
В данном случае это не имеет значения: если бы (?<=^|\A|\s|\b)
дало бы желаемый результат, то все равно вам нужно было бы \b
. Символ, следующий за утверждением, должен быть s
- символом слова, поэтому \b
означает либо (1) предыдущий символ , а не символ слова, либо (2) там без предыдущего символа В таком случае ^
, \A
и \s
являются избыточными.
Однако, если строка начинается с !
, это другая история. ^
и \A
по-прежнему соответствуют началу строки, до !
, но \b
соответствует после it. Если вы хотите сопоставить !substring!
как полную строку, вы должны использовать /\A!substring!\Z/
, но если вы хотите сопоставить только целое слово substring
, вы должны использовать /\bsubstring\b/
.
Что касается [^\B]
, то это просто соответствует любому символу, кроме B
. Как и \b
, \B
является утверждением нулевой ширины, и класс символов должен соответствовать ровно одному символу. Некоторые разновидности регулярных выражений выдают исключение для недопустимой escape-последовательности \B
, но Ruby (или Oniguruma, более вероятно) позволяет ему скользить.