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

Насколько я знаю, я нашел интересную проблему, на которую здесь нет ответа. У меня есть объект регулярного выражения, который я использую для замены внутри строки. Проблема в том, что если я хочу остановить дальнейшие замены, потому что я нашел определенную строку, я не могу этого сделать. Оператор «break», очевидно, не работает, потому что это не цикл и не случай переключения.

Если я использую «возврат», замены продолжатся. Я могу использовать «незавершенную» переменную (см. пример ниже) в начале функции, чтобы предотвратить дальнейшие замены, но проверки будут продолжаться, она будет оцениваться столько раз, сколько соответствует регулярному выражению, что не требуется.

Есть ли способ полностью остановить замену этой функции?

Спасибо.

Пример:

var regex = new RegExp("whatever", "g");
str = str.replace(regex, function(tot, group1) {
    if (group1 == "i_wanna_stop_str") {
        incomplete = true;
        break; <-- not working
    } else {
        ... compute replacement ...
        return replacement;
    }
}

person Juanma    schedule 24.04.2013    source источник
comment
Здесь невозможно остановить вызов функции обратного вызова, но почему вы не можете сформировать регулярное выражение для сопоставления до определенного момента? У вас есть пример, когда хорошее написанное регулярное выражение не может исправить этот случай?   -  person VisioN    schedule 24.04.2013
comment
проверьте это stackoverflow.com/questions/3214886/   -  person Rahul R.    schedule 24.04.2013
comment
Конечно, я мог бы, но здесь не в этом дело, это просто пример. Вероятно, точный вопрос должен быть: как я могу остановить эту функцию обратного вызова, выполняющую замены после определенного совпадения?. Любая строка здесь означает регулярное выражение, которому может соответствовать множество строк.   -  person Juanma    schedule 28.02.2017


Ответы (2)


Замените оригиналом, как только флаг будет найден:

var regex = new RegExp("whatever", "g");
str = str.replace(regex, function(tot, group1) {
    if (group1 == "i_wanna_stop_str") {
        incomplete = true;
        break; <-- not working
    } else {
        if (incomplete) {
            replacement = <captured original>;
        } 
        else {
            ... compute replacement ...
        }
        return replacement;
    }
}
person Klas Lindbäck    schedule 24.04.2013
comment
Да, это будет работать, но не прерывает обратный вызов после совпадения стоп-слова, поэтому ненужные сравнения все еще имеют место. Спасибо, в любом случае. Я думаю, что 100% правильный ответ должен касаться управления обратными вызовами, как в stackoverflow.com/questions/29403229/ - person Juanma; 28.02.2017
comment
@Juanma Если вам удалось найти хорошее решение, не стесняйтесь поделиться им, ответив на свой вопрос. - person Klas Lindbäck; 28.02.2017

Цикл замены, пока найдено регулярное выражение для замены И оно находится перед стопорной строкой

в коде:

var str = " blah blah whatever blah blah whatever i_wanna_stop_str blah blah whatever";
var stopStr = "i_wanna_stop_str";
var searchStr = "whatever";
while (str.indexOf(searchStr) != -1 && str.indexOf(searchStr) < str.indexOf(stopStr)) {
    str = str.replace(/whatever/, "some");
} 
person jdnoprada    schedule 24.04.2013
comment
Конечно, это решает проблему, но не отвечает на мой вопрос о функции обратного вызова. Спасибо, в любом случае. - person Juanma; 28.02.2017