Проблема решается позитивной ретроспективной проверкой. Утверждением, что перед совпадением должен быть символ "-"
Суть ошибки:
Машина регулярных выражений штука довольно тупая, она стартует с первого символа исходной строки, примеряет регулярное выражение. Если совпало - отлично, делает что надо. Если не совпало, перемещается на следующий символ и опять проверяет. И так, символ за символом движется к концу строки. (это общий алгоритм, ради производительности добавляются оптимизации, анализирующие регулярку и исключающие части стрики, точно не попадающие под неё)
До позиции последнего символа - проблем нет, регулярка не совпадает.
Затем:
В позиции -23-0-^345345435 маска [^-] совпадает. * - это ноль или больше совпадений; звёздочка жадная, сразу хапает всего всего и побольше до первого символа, не совпадающего с маской. И это оказывается конец строки - а он нам и нужен, совпадение всего выражения, меняем на 42.
Далее сюрприз: мы находимся в позиции -23-0-345345435^ (аккурат в конце строки). * - это ноль или больше совпадений. Что там дальше? Ага, конец строки, это нас устраивает. Регулярка совпала, меняем (ничего, пустую строку) на 42.
|