Вот что я получил в консоли Chrome 78.
console.log('1111'.replace(/(^|[^2])/g, '$12'))
// output "21121212"
Почему он не заменяет первый 1
на 12
?
Вот что я получил в консоли Chrome 78.
console.log('1111'.replace(/(^|[^2])/g, '$12'))
// output "21121212"
Почему он не заменяет первый 1
на 12
?
Я думаю, что происходит то, что после замены совпадения нулевой ширины он увеличивает позицию во входной строке на 1 перед поиском следующего совпадения. В противном случае он застрял бы в бесконечном цикле, постоянно сопоставляя и заменяя одну и ту же строку нулевой ширины.
Поскольку ^
соответствует строке нулевой ширины в начале, она увеличивает позицию, пропуская первый символ строки перед поиском следующего совпадения.
Я предполагаю, что вы пытаетесь написать
(?<=^)|([^2])
тем не менее, вы хотели бы проверить, поддерживаются ли обходные пути или нет.
Этот метод также имеет обходные пути,
(?<=^|[^2])
Если вы предоставите несколько примеров входных и выходных данных, могут быть некоторые обходные пути.
Например, возможно, положительный прогноз может быть вариантом для изучения:
(?=^|[^2]|$)
Если вы хотите упростить/изменить/исследовать выражение, это объяснено на верхней правой панели regex101. ком. Если хотите, вы также можете посмотреть по этой ссылке, как она будет соответствовать против некоторых выборочных входных данных.
jex.im визуализирует обычные выражения:
$1
— это ссылка на захваченное совпадение. - person ggorlen   schedule 14.11.2019212121212
. - person yqlim   schedule 14.11.201921121212
. - person Tim Biegeleisen   schedule 14.11.2019