Javascript Regex - заменить последовательность символов с тем же номером другого символа - PullRequest
6 голосов
/ 17 сентября 2011

Я пытаюсь заменить часть строки тем же количеством фиктивных символов в JavaScript, например: '== Hello ==' на '== ~~~~~ =='.

На этот вопрос ответили с помощью Perl и PHP , но я не могу заставить его работать в JavaScript.Я пробовал это:

txt=txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3");

Сопоставление с образцом работает нормально, но замена - нет - вторая часть добавляет «~~» вместо длины сопоставления с образцом.Ввод $ 2 внутри скобок не работает.Что я могу сделать, чтобы он вставил правильное количество символов?

Ответы [ 4 ]

7 голосов
/ 17 сентября 2011

Вместо этого используйте функцию для замены:

var txt = "==Hello==";
txt = txt.replace(/(==)([^=]+)(==)/g, function ($0, $1, $2, $3) {
    return $1 + (new Array($2.length + 1).join("~")) + $3;
});

alert(txt);
//-> "==~~~~~=="
1 голос
/ 17 сентября 2011

Атрибут длины вычисляется до замены $ 2, поэтому метод replace () не будет работать.Вызов функции, предложенный Августом, должен работать, другой подход будет использовать match () вместо replace ().

Использование match () без / g возвращает массив результатов совпадений, которые можно объединить, когда выОжидайте.

txt="==Hello==";
mat=txt.match(/(==)([^=]+)(==)/);  // mat is now ["==Hello==","==","Hello","=="]
txt=mat[1]+Array(mat[2].length+1).join("~")+mat[3]; // txt is now "==~~~~~=="

Вы исключили начальный / конечный символ из среднего выражения, но если вы хотите большей гибкости, вы можете использовать это и обрабатывать все, что заключено в скобки с начальными / конечными литералами.

mat=txt.match(/(^==)(.+)(==$)/)
0 голосов
/ 06 апреля 2019

вопрос с выражением

txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3") 

означает, что "$2".length заставляет $2 быть принятым в качестве строкового литерала, а именно строки "$2" длиной 2.

Из документов MDN :

Поскольку мы хотим дополнительно преобразовать результат совпадения перед выполнением окончательной замены, мы должны использовать функцию.

Это вызывает оценку совпадения до преобразования.

Со встроенной функцией в качестве параметра (и repeat) - здесь $1, $2, $3 - локальные переменные:

txt.replace(/(==)([^=]+)(==)/g, (_,$1,$2,$3) => $1+'~'.repeat($2.length)+$3);

txt = '==Hello==';

//inline function
console.log(
  txt.replace(/(==)([^=]+)(==)/g, (_, g1, g2, g3) => g1 + '~'.repeat(g2.length) + g3)
);
0 голосов
/ 17 сентября 2011

A рабочий образец использует следующий фрагмент:

var processed = original.replace(/(==)([^=]+)(==)/g, function(all, before, gone, after){
    return before+Array(gone.length+1).join('~')+after;
});

Проблема в вашем коде заключалась в том, что вы всегда измеряли длину "$2" (всегда строка из двух символов),Имея функцию, вы можете измерить длину соответствующей части.См. документацию по замене для дальнейших примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...