2016-02-02 4 views
2

У меня есть регулярное выражение, которое в настоящее время выглядит следующим образом:Заменить только часть матча

/((0{32})([0-1]{48}){16})/ 

В принципе, матч «0» 32 раз, а затем «0» или «1» 48 раз, то, что картина 16 раз , Кажется, работает на str.match().

То, что я пытаюсь сделать, это заменить «0» s соответствие только в этой первой части (32, каждый из 16 раз) с «1», но не с «0» в соответствии с вторая часть (диапазон [0-1] - 48).

Кажется, я не могу окунуться в голову, как это сделать сегодня.

Шаблон регулярного выражения создается отдельно, но строка, в которой он совпадает, всегда будет содержать только «0» и «1». Да, я уверен, что это кажется странным, но это именно то, что мне нужно.

+0

использовать функцию замены() и внутри него, заменить() текст в первом матче группового этапа, возвращая остальное не-изменен – dandavis

+1

Пожалуйста, пост ввода и ожидаемый результат. –

+0

@noob Это будут страницы (длина строки 16 000 символов). Но в основном, очень длинная строка из ничего, кроме «0» и «1», причем конечный результат совпадает с нулями, преобразованными в единицы. –

ответ

3

Вам нужно использовать позитивный взгляд, чтобы утверждать, что за 32 нулями должны следовать 48 единиц и нулей, но на самом деле их не захватывать. Например:

/((0{32})(?=([0-1]{48}){16}))/ 
+0

Я понятия не имел javascript, поддерживаемый lookaheads ... – Marie

+0

@Toni yup. Lookaheads не проблема. Однако Lookbehinds - еще одна история. –

+0

Почти. Похоже, что он заменяет сопоставленный 32 одним «1» - используя «str.replace (myReg,« 1 »)' Поскольку 32 может быть другой длиной (сгенерированным числом), есть простой способ рассказать об этом замените каждый из совпадающих «0» вместо всех? –

Смежные вопросы