Рабочий раствор ( демо ).Решение проблемы - 99 шагов, что является ненужной жертвой в этом простом примере.Есть ситуации, когда жертва, если таковая имеется, более чем разумна.
Это оказалось очень простым.Сделайте группу захвата 1 притяжательной .Это означает, что что бы он ни захватывал, он не сдастся, если регулярное выражение попытается вернуться назад.Здесь это означает, что, как только он решит, что число должно предшествовать $
, он не позволит возврату регулярного выражения, если после номера также следует $
.Он сдастся и пойдет дальше, найдя следующую границу, за которой следуют цифры, и осмотрит окрестности.
( # capture 1, because we can't quantify lookarounds
(?<=\$) # Asserts that $ precedes current position
)?+ # close capture 1, make it "optional" (0 or 1 times)
# the possessive quantifier is the only change to the regex
# + is only 'possessive' when it's the second character of a quantifier
\b # boundary
\d+ # digits
\b # boundary
(?(1) # conditional that capture #1 was a success
(?!\$) # if successful, assert that it is not followed by a #
|
(?=\$) # unsuccessful, assert that this position is followed by a $
)