Заменить несколько строк вхождения, используя элемент массива - PullRequest
3 голосов
/ 16 августа 2011

У меня есть несколько строк в ассоциативном массиве:

    var arr = {
        '============================================': '---------',
        '++++++++++++++++++++++++++++++++++++++++++++': '---------',
        '--------------------------------------------': '---------'
    };

Я хочу заменить вхождения каждой клавиши на соответствующее значение. То, что я придумал, это:

    for (var i in arr)
    {
        strX = str.replace(i, arr[i]);

        console.log('arr[\''+i+'\'] is ' + arr[i] + ': ' + strX);
    }

Это работает, но только в первый раз. Если я изменю регулярное выражение на /i/g, код не будет работать.

for (var i in arr)
{
    strX = str.replace(/i/g, arr[i]);

    console.log('arr[\''+i+'\'] is ' + arr[i] + ': ' + strX);
}

Ребята, вы знаете, как обойти это?

Ответы [ 3 ]

7 голосов
/ 16 августа 2011

вместо

strX = str.replace(/i/g, arr[i]);

Вы хотите сделать что-то вроде.

strX = str.replace(new RegExp(i, "g"), arr[i]);

Это потому, что /i/g относится к букве i, а не к значению переменной i. ОДНАКО одна из ваших базовых строк имеет знаки плюс, которые являются метасимволами в регулярных выражениях. Они должны быть спасены. Самый быстрый взлом выглядит следующим образом:

new RegExp(i.replace(/\+/g, "\\+"), "g"), arr[i]);

Вот рабочий пример: http://jsfiddle.net/mFj2f/

В общем, я думаю, что нужно проверять все метасимволы, я думаю.

2 голосов
/ 16 августа 2011

i в регулярном выражении будет строкой i, а не переменной i.Попробуйте вместо new RegExp(i,'g');, и вы получите желаемый результат

0 голосов
/ 03 июля 2015

   var W,H,A,K;

W='123456'.split(''),

H='test this WHAK com www for'.split(' '),

A='2 is a 1 (1ed 6 3 2, 1 6 3 that), 1ing 6 5.3.4';

K=0;for(K in W)A=A.split(W[K]).join(H[K]);

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