JavaScript заменить / регулярное выражение - PullRequest
90 голосов
/ 22 июля 2009

С учетом этой функции:

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(pattern, value);
        }

    };

    return repeater;

};

Как заставить this.markup.replace() заменить глобально? Здесь проблема. Если я использую это так:

alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);

Значение оповещения - "foobar $ TEST_ONE".

Если я изменю Repeater на следующее, в Chrome ничего не будет заменено:

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
        }

    };

    return repeater;

};

... и предупреждение $TEST_ONE $TEST_ONE.

Ответы [ 3 ]

123 голосов
/ 22 июля 2009

Вам необходимо дважды экранировать любые символы RegExp (один раз для косой черты в строке и один раз для регулярного выражения):

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

В противном случае он ищет конец строки и «TESTONE» (который он никогда не находит).

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

69 голосов
/ 22 июля 2009

С точки зрения интерпретации паттернов, нет никакой разницы между следующими формами:

  • /pattern/
  • new RegExp("pattern")

Если вы хотите заменить буквальную строку, используя метод replace, я думаю, вы можете просто передать строку вместо регулярного выражения в replace.

В противном случае вам нужно было бы сначала избегать любых специальных символов регулярного выражения в шаблоне - возможно, так:

function reEscape(s) {
    return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}

// ...

var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);
26 голосов
/ 22 июля 2009

Ваш шаблон регулярного выражения должен иметь модификатор g:

var pattern = /[somepattern]+/g;

обратите внимание на g в конце. он говорит заменителю выполнить глобальную замену.

Также вам не нужно использовать объект RegExp, вы можете создать свой шаблон, как указано выше. Пример шаблона:

var pattern = /[0-9a-zA-Z]+/g;

шаблон всегда окружен / с обеих сторон - с модификаторами после финала /, причем модификатор g является глобальным.

РЕДАКТИРОВАТЬ: Почему это важно, если шаблон является переменной? В вашем случае это будет работать следующим образом (обратите внимание, что шаблон все еще является переменной):

var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");

Но вам нужно изменить функцию замены следующим образом:

this.markup = this.markup.replace(pattern, value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...