javascript regexp заменить текст до определенного символа
Имеется строка вида 00001000.
Нужно написать регулярку, заменяющую все нули слева от 1 на 2.
Количество нулей может быть разным.
Примеры преобразований:
00001000->22221000;0010000->2210000.
Ответы (2 шт):
Заменяем нули перед каждой из единиц:
Если единиц может быть несколько и требуется заменять нули перед каждой из них, то решение может выглядеть следующим образом:
var original = "00001000100101100";
var result = original.replace(/0(?=0*1)/g, "2");
console.log(result);
Примечание: данный вариант базируется на использовании non-capturing group via zero-width positive lookahead.
Заменяем нули только перед первой из единиц:
Если, все же, единиц может быть несколько и нужно заменить нули только перед первой из них, то этого можно достичь следующим образом:
var original = "00001000100101100";
var result = original.replace(/(?<=^0*)0(?=0*1)/g, "2");
console.log(result);
Примечание: данное решение базируется на non-capturing group via zero-width positive lookbehind & via zero-width positive lookahead.
Заменяем нули только перед первой из единиц (альтернатива):
В соответствии с предложением из комментариев, оказывается, в JS за счет специфичного флага sticky можно достигнуть аналогичного для данной ситуации результата куда проще:
var original = "00001000100101100";
var result = original.replace(/0(?=0*1)/gy, '2');
console.log(result);
Примечания:
- любое из вышепредставленных решений является корректным для случая, когда единица может быть всего одна, но меня интересовали более сложные случаи;
- любое из вышепредставленных решений можно было бы оптимизировать использовав
reluctantвместоgreedy quantifiers(заменив все*/+на*?/+?), но это лишь усложнило бы примеры, при этом не принеся никакого прироста производительности вследствие используемых при поиске символов (прирост был бы ощутим в случае использования потенциально перекрывающих друг друга групп символов).
Как вариант, замена начальных нулей, с помощью str.replace(regexp, function):
var original = "00001000100101100";
var result = original.replace(/(0+)(1\d*)/g, function(match, p1, p2) {
return p1.replace(/0/g, '2') + p2;
});
console.log(original);
console.log(result);