RegEx идеально соответствует, но пропускает совпадения при замене ⇐ Javascript
RegEx идеально соответствует, но пропускает совпадения при замене
У меня есть текст, содержащий заполнители, например %%%NAME.suffix|DefaultValue%%%.
Следующее регулярное выражение идеально соответствует ему (см. ссылку): %{3}((\w+)(?:\.(\w+))?)(?:\|([\s\S ]*?))?%{3}
Но он пропускает совпадения, когда я заменяю их одно за другим в JavaScript (ES5, то же самое в ES6 или более поздних версиях) с помощью цикла while.
Я не использую шаблон RexEx в String.replace(/a/gm, "b"), а простую строку String.replace("%%%NAME.suffix|DefaultValue%%%", "DefaultValue").
var суп = "%%%X.x|a%%% %%%Y.y|b%%% %%%Z.z|c%%%"; вар м; while ((m = regex.exec(суп)) !== null) { // Это необходимо, чтобы избежать бесконечных циклов с совпадениями нулевой ширины. if (m.index === regex.lastIndex) { регулярное выражение.lastIndex++; } console.log(m[2] + " найдено: " + JSON.stringify(m, null, 2)); суп = суп.replace(m[0], m[4]); } Результат: заполнитель Y пропущен. Почему?
Выход:
X найден: [ "%%%X.x|a%%%", "X.x", "X", "x", "a" ] Z найден: [ "%%%Z.z|c%%%", "Z.z", "Z", "z", "c" ] Также см. полный код здесь: https://runjs.co/s/IcNbKwSCu
У меня есть текст, содержащий заполнители, например %%%NAME.suffix|DefaultValue%%%.
Следующее регулярное выражение идеально соответствует ему (см. ссылку): %{3}((\w+)(?:\.(\w+))?)(?:\|([\s\S ]*?))?%{3}
Но он пропускает совпадения, когда я заменяю их одно за другим в JavaScript (ES5, то же самое в ES6 или более поздних версиях) с помощью цикла while.
Я не использую шаблон RexEx в String.replace(/a/gm, "b"), а простую строку String.replace("%%%NAME.suffix|DefaultValue%%%", "DefaultValue").
var суп = "%%%X.x|a%%% %%%Y.y|b%%% %%%Z.z|c%%%"; вар м; while ((m = regex.exec(суп)) !== null) { // Это необходимо, чтобы избежать бесконечных циклов с совпадениями нулевой ширины. if (m.index === regex.lastIndex) { регулярное выражение.lastIndex++; } console.log(m[2] + " найдено: " + JSON.stringify(m, null, 2)); суп = суп.replace(m[0], m[4]); } Результат: заполнитель Y пропущен. Почему?
Выход:
X найден: [ "%%%X.x|a%%%", "X.x", "X", "x", "a" ] Z найден: [ "%%%Z.z|c%%%", "Z.z", "Z", "z", "c" ] Также см. полный код здесь: https://runjs.co/s/IcNbKwSCu
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение