Как вы используете переменную в регулярном выражении? - PullRequest
1150 голосов
/ 30 января 2009

Я хотел бы создать метод String.replaceAll() в JavaScript, и я думаю, что использование регулярного выражения было бы наиболее кратким способом сделать это. Однако я не могу понять, как передать переменную в регулярное выражение. Я могу сделать это уже, что заменит все экземпляры "B" на "A".

"ABABAB".replace(/B/g, "A");

Но я хочу сделать что-то вроде этого:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

Но очевидно, что это заменит только текст "replaceThis" ... так как мне передать эту переменную в мою строку регулярного выражения?

Ответы [ 18 ]

4 голосов
/ 08 мая 2013

Вот еще одна замена всех реализаций:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };
3 голосов
/ 30 января 2009

Хотя вы можете создавать динамически создаваемые RegExp (как и другие ответы на этот вопрос), я повторю свой комментарий из аналогичного поста : функциональная форма String.replace ( ) чрезвычайно полезен и во многих случаях снижает потребность в динамически создаваемых объектах RegExp. (это довольно сложно, потому что вы должны выражать входные данные для конструктора RegExp в виде строки, а не использовать литеральный формат слешей / [A-Z] + / regexp)

3 голосов
/ 05 июня 2013

Чтобы удовлетворить мою потребность вставить переменную / псевдоним / функцию в регулярное выражение, вот что я придумал:

oldre = /xx\(""\)/;
function newre(e){
    return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

где 'oldre' - это исходное регулярное выражение, в которое я хочу вставить переменную, «xx» - это заполнитель для этой переменной / псевдонима / функции, yy - фактическое имя переменной, псевдоним или функция.

3 голосов
/ 26 ноября 2014

И версия ответа Стивена Пенни, написанная coffeescript, так как это результат №2 в Google .... даже если кофе - это просто javascript с удалением большого количества символов ...;)

baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food

и в моем конкретном случае

robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
  console.log "True!"
1 голос
/ 18 октября 2018

Ни один из этих ответов не был мне понятен. В конце концов я нашел хорошее объяснение на http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/

Простой ответ:

var search_term = new RegExp(search_term, "g");    
text = text.replace(search_term, replace_term);

Например:

$("button").click(function() {
  Find_and_replace("Lorem", "Chocolate");
  Find_and_replace("ipsum", "ice-cream");
});

function Find_and_replace(search_term, replace_term) {
  text = $("textbox").html();
  var search_term = new RegExp(search_term, "g");
  text = text.replace(search_term, replace_term);
  $("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>
1 голос
/ 13 июня 2013

Вы можете использовать это, если $ 1 не работает с вами

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
1 голос
/ 27 октября 2015

Ваше решение здесь:

Передать переменную в регулярное выражение.

То, что я реализовал, - это взятие значения из текстового поля, которое вы хотите заменить, а другое - текстовое поле «заменить на», получение значения из текстового поля в переменной и установка переменная для функции RegExp для дальнейшей замены. В моем случае я использую Jquery, вы также можете сделать это только с помощью JavaScript.

Код JavaScript:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
  var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.

  var sRegExInput = new RegExp(replace, "g");    
  $("body").children().each(function() {
    $(this).html($(this).html().replace(sRegExInput,replace_with));
  });

Этот код находится в событии Onclick кнопки, вы можете поместить его в функцию для вызова.

Так что теперь вы можете передать переменную в функцию замены.

1 голос
/ 16 августа 2013

Вы всегда можете использовать indexOf несколько раз:

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

Это не входит в бесконечный цикл, когда замена содержит совпадение.

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