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

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

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

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

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

1509
JC Grubbs 30 Янв 2009 в 03:11

20 ответов

Лучший ответ

Вместо использования синтаксиса /regex/g вы можете создать новый RegExp объект:

var replace = "regex";
var re = new RegExp(replace,"g");

Таким способом вы можете динамически создавать регулярные выражения. Тогда вы будете делать:

"mystring".replace(re, "newstring");
1785
jcubic 17 Дек 2016 в 09:53

Вот еще одна замена replaceAll:

    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;
    };
4
scripto 8 Май 2013 в 10:30

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

Как всегда: не используйте регулярные выражения, если нет необходимости. Для простой замены строки используется идиома:

'ABABAB'.split('B').join('A')

Тогда вам не нужно беспокоиться о проблемах цитирования, упомянутых в ответе Gracenotes.

113
Liam 30 Янв 2018 в 11:45

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

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
Alex Li 5 Июн 2013 в 04:38

Как упоминал Эрик Венделин, вы можете сделать что-то вроде этого:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

Это дает "regex matching .". Тем не менее, он потерпит неудачу, если str1 равен ".". Вы ожидаете, что результатом будет "pattern matching regex", заменив период на "regex", но он окажется ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Это связано с тем, что, хотя "." является строкой, в конструкторе RegExp он по-прежнему интерпретируется как регулярное выражение, означающее любой символ без прерывания строки, то есть каждый символ в строке. Для этой цели может быть полезна следующая функция:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

Тогда вы можете сделать:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

Уступая "pattern matching regex".

207
Qtax 19 Июн 2012 в 08:15

Вы всегда можете использовать 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);
};

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

1
Ry- 16 Авг 2013 в 19:53
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Протестируйте с помощью этого инструмента

9
unigogo 1 Фев 2009 в 09:28

Вы хотите построить регулярное выражение динамически, и для этого правильным решением будет использование конструктора new RegExp(string). Чтобы конструктор обрабатывал специальные символы буквально , вы должны экранировать их. В есть виджет автозаполнения пользовательского интерфейса jQuery, который называется $.ui.autocomplete.escapeRegex, есть встроенная функция:

[...] вы можете использовать встроенный $.ui.autocomplete.escapeRegex функция. Это займет одну строку аргумент и экранировать все символы регулярного выражения, делая результат безопасным для перейти к new RegExp().

Если вы используете пользовательский интерфейс jQuery, вы можете использовать эту функцию или скопировать ее определение из источника:

function escapeRegex( value ) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

И используйте это так:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"
14
Salman A 21 Авг 2019 в 13:33

Этот:

var txt=new RegExp(pattern,attributes);

Эквивалентно этому:

var txt=/pattern/attributes;

См. http://www.w3schools.com/jsref/jsref_obj_regexp.asp.

30
Jeremy Ruten 30 Янв 2009 в 00:19

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

3
Community 23 Май 2017 в 12:10

Для множественной замены без регулярных выражений я пошел со следующим:

      let str = "I am a cat man. I like cats";
      let find = "cat";
      let replace = "dog";


      // Count how many occurrences there are of the string to find 
      // inside the str to be examined.
      let findCount = str.split(find).length - 1;

      let loopCount = 0;

      while (loopCount < findCount) 
      {
        str = str.replace(find, replace);
        loopCount = loopCount + 1;
      }  

      console.log(str);
      // I am a dog man. I like dogs

Важная часть решения была найдена здесь

0
John Shearing 24 Ноя 2019 в 01:52

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

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

То, что я реализовал, - это взятие значения из текстового поля, которое вы хотите заменить, а другое - текстовое поле «заменить на», получение значения из текстового поля в переменной и присвоение переменной значения 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
s4ik4t 12 Июл 2018 в 06:56

Эта функция, вызывающая себя, будет перебирать элементы replacerItems с использованием индекса и глобально изменять replacerItems [index] в строке при каждом проходе.

  const replacerItems = ["a", "b", "c"];    

    function replacer(str, index){
          const item = replacerItems[index];
          const regex = new RegExp(`[${item}]`, "g");
          const newStr = str.replace(regex, "z");
          if (index < replacerItems.length - 1) {
            return replacer(newStr, index + 1);
          }
          return newStr;
    }

// console.log(replacer('abcdefg', 0)) will output 'zzzdefg'
0
Flemming Hansen 16 Дек 2019 в 17:24

И версия ответа Стивена Пенни, написанная 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!"
4
keen 29 Окт 2015 в 15:49

Если вы хотите получить ВСЕ вхождения (g), учитывайте регистр (i) и используйте границы, чтобы это не было словом в другом слове (\\b):

re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

Примере:

let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.
31
JBallin 13 Июн 2018 в 02:52

Ни один из этих ответов не был понятен мне. В конце концов я нашел хорошее объяснение на 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>
0
Paul Jones 18 Окт 2018 в 18:37
this.replace( new RegExp( replaceThis, 'g' ), withThis );
20
Mike Samuel 16 Янв 2012 в 16:22
String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

Проверьте это как:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
5
MetalGodwin 20 Авг 2013 в 12:35

Для тех, кто хочет использовать переменную с методом match , это работает для меня

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
34
Steven Penny 9 Май 2015 в 17:48

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

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
2
Fareed Alnamrouti 13 Июн 2013 в 11:13