javascript regexp заменить текст до определенного символа

Имеется строка вида 00001000.

Нужно написать регулярку, заменяющую все нули слева от 1 на 2.

Количество нулей может быть разным.

Примеры преобразований:

  • 00001000 -> 22221000;
  • 0010000 -> 2210000.

Ответы (2 шт):

Автор решения: StateItPrimitive

Заменяем нули перед каждой из единиц:

Если единиц может быть несколько и требуется заменять нули перед каждой из них, то решение может выглядеть следующим образом:

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 (заменив все */+ на *?/+?), но это лишь усложнило бы примеры, при этом не принеся никакого прироста производительности вследствие используемых при поиске символов (прирост был бы ощутим в случае использования потенциально перекрывающих друг друга групп символов).
→ Ссылка
Автор решения: UModeL

Как вариант, замена начальных нулей, с помощью 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);

→ Ссылка