Вот ваше текущее регулярное выражение:
\b.*#\b
А вот первый пример ввода:
a #b #c #
^^^^^^ <-- last word boundary is here
Первая граница слова на самом деле имеет место перед начальной a
. Тогда .*
будет жадно потреблять все до тех пор, пока не будет last #
, за которым следует граница слова. Как вы цитировали, между словом и несловесным символом возникает граница слова, или наоборот. В последний раз это происходит #c
, поскольку за последним #
(с учетом того, что #
является , а не символом слова) не следует символ слова.
Если вы просто хотите захватить все слова, оканчивающиеся на #
, просто используйте это:
[^# ]+#
Демо