В Javascript, как я могу выполнить глобальную замену строки с переменной внутри '/' и '/ g'? - PullRequest
63 голосов
/ 12 февраля 2009

Я хочу выполнить глобальную замену строки, используя String.replace в Javascript.

В документации я прочитал, что я могу сделать это с / g, то есть, например;

var mystring = mystring.replace(/test/g, mystring);

и это заменит все вхождения внутри mystring. Нет выражений для выражения.

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

Я пробовал что-то вроде этого:

var stringToFind = "test";

// первая попытка

mystring = mystring.replace('/' + stringToFind + '/g', mystring);

// вторая попытка, не имеет особого смысла

mystring = mystring.replace(/stringToFind/g, mystring);

но они не работают. Есть идеи?

Ответы [ 11 ]

178 голосов
/ 12 февраля 2009
var mystring = "hello world test world";
var find = "world";
var regex = new RegExp(find, "g");
alert(mystring.replace(regex, "yay")); // alerts "hello yay test yay"

Если вам нужно это в функцию

  replaceGlobally(original, searchTxt, replaceTxt) {
    const regex = new RegExp(searchTxt, 'g');
    return original.replace(regex, replaceTxt) ;
  }
70 голосов
/ 12 февраля 2009

Для регулярных выражений new RegExp(stringtofind, 'g');. НО. Если «find» содержит символы, которые являются специальными в регулярном выражении, они будут иметь свое регулярное значение. Так что, если вы пытались заменить «.» в 'abc.def' с 'x' вы получите 'xxxxxxx' - упс.

Если все, что вам нужно, это простая замена строки, вам не нужны регулярные выражения! Вот простая строка, заменяющая идиому:

mystring= mystring.split(stringtofind).join(replacementstring);
36 голосов
/ 16 января 2014

Регулярные выражения намного медленнее, чем поиск строк. Таким образом, создание регулярного выражения с экранированной строкой поиска не является оптимальным способом. Даже зацикливание строки будет быстрее, но я предлагаю использовать встроенные предварительно скомпилированные методы.

Вот быстрый и понятный способ быстрой замены глобальной строки:

sMyString.split(sSearch).join(sReplace);

И это все.

16 голосов
/ 13 февраля 2009
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(RegExp.quote(replaceThis),"g"); 
   return this.replace(re, withThis);
};


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

var aa = "qwerr.erer".replaceAll(".","A");
alert(aa);

должность Сильмира

3 голосов
/ 12 февраля 2009

Это регулярное выражение, а не строка. Используйте конструктор для объекта RegExp для динамического создания регулярного выражения.

var r = new RegExp(stringToFind, 'g');
mystring.replace(r, 'some replacement text');
2 голосов
/ 12 февраля 2009

Попробуйте:

var stringToFind = "test";
mystring = mystring.replace(new RegExp(stringToFind, "g"), mystring);
1 голос
/ 29 августа 2018

Вы можете использовать следующее решение для глобальной замены строки с переменной внутри '/' и '/ g':

myString.replace(new RegExp(strFind, 'g'), strReplace);
1 голос
/ 14 июня 2011

Динамическая глобальная замена

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

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

Например, чтобы заглавная буква всех слов (например, "cat sat mat" в "Cat Sat Mat") была заглавной с глобальной заменой поиска Вот как это сделать.

function capitaliseWords(aString) {
    // Global match for lowercase letters following a word boundary
    var letters = aString.match(/\b[a-z]/g), i, letterMatch;
    // Loop over all matched letters
    for( i = 0; i < letters.length; i++ ) {
        // Replace the matched letters with upper case versions
        letterMatch = new RegExp('\\b'+letters[i]); // EDIT - slight fix
        aString = aString.replace(letterMatch, letters[i].toUpperCase());
    }
    // Return our newly capitalised string
    return aString;
}

alert( capitaliseWords("cat sat mat") ); // Alerts "Cat Sat Mat"
1 голос
/ 12 февраля 2009

Если вы хотите интерполировать переменные, вам нужно использовать объект RegExp

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Regular_Expressions

Пример:

var str = "This is my name";
var replace = "i";
var re = new RegExp(replace, 'g')    

str = str.replace(re, 'p');
alert(str);
0 голосов
/ 02 декабря 2015

Вы можете сделать, используя следующий метод

см. Эту функцию:

function SetValue()
{
    var txt1='This is a blacK table with BLack pen with bLack lady';
    alert(txt1);
    var txt2= txt1.replace(/black/gi,'green');
    alert(txt2);
}

синтаксис:

/ SEARCH_STRING / {г | г}

, где

  • g - глобальная замена с учетом регистра
  • ги - блобная нечувствительная к регистру замена

Вы можете проверить эту ссылку JSBIN

http://jsbin.com/nohuroboxa/edit?html,js,output

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