У Javascript, як я можу виконати глобальну заміну рядка зі змінною всередині '/' та '/ g'?


75

Я хочу виконати глобальну заміну рядка за допомогою 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);

але вони не працюють. Будь-які ідеї?


2
На ваше запитання дано відповідь тут: stackoverflow.com/questions/494035/…
Ерік Венделін,

Відповіді:


-17

Чи можете ви використовувати prototype.js? Якщо так, ви можете використовувати String.gsub, наприклад

var myStr = "a day in a life of a thing";
 var replace = "a";
 var resultString = myStr.gsub(replace, "g");
 // resultString will be "g day in g life of g thing"

Для цього також потрібні регулярні вирази. Для мене це один з найбільш елегантних способів його вирішення. документація прототипу gsub


15
Там це набагато більш просте рішення , яке на самому ділі досить ефективним: myStr.split('a').join('g'). Також не вимагає prototype.js.
cloudfeet

2
Це не корисна відповідь, оскільки існують прості способи досягнення того самого, що відповідають стандартам.
rmcclellan

@cloudfeet: Your - це справді дуже просте рішення, але просто цікаво, яке з них буде більш ефективним - використання об’єкта RegExp (рішення Паоло Бергантіно нижче) або вашого рішення, яке створює масив на льоту, а потім приєднує елементи масиву?
Мандіп Сінгх,

203
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) ;
  }

Ви могли б зробити це простіше: alert (mystring.replace (new RegExp ("world", "g"), "yay"))
ColorCodin

84

Для регулярних виразів, new RegExp(stringtofind, 'g');. АЛЕ. Якщо "знайти" містить символи, які є особливими у регулярному виразі, вони матимуть своє значення "регулярне вираження". Отже, якщо ви намагалися замінити "." у 'abc.def' з 'x' ви отримаєте 'xxxxxxx' - вуп.

Якщо все, що вам потрібно - це проста заміна рядка, немає необхідності в регулярних виразах! Ось ідіома заміни простого рядка:

mystring= mystring.split(stringtofind).join(replacementstring);

2
+1 завжди добре бачити, як люди думають далі, ніж буквальна відповідь на запитання.
Томас

Цікаво, як це погіршується для більших рядків у порівнянні з викликом RegExp ()?
Като

3
@Kato мені теж було цікаво, тому я створив тест продуктивності jsperf, щоб дізнатись. посилання: goo.gl/cbZiV
starbeamrainbowlabs

1
Просто перевірте firefox, і Regex є найшвидшим. (Я раніше використовував хром)
starbeamrainbowlabs

1
@starbeamrainbowlabs дуже цікаві результати! Старий добрий IE; завжди непередбачувано погано навмання, здавалося б, важливі речі
:)

39

Регулярні вирази набагато повільніші, ніж пошук у рядках. Отже, створення регулярного виразу з екранованим пошуковим рядком не є оптимальним способом. Навіть цикл, хоча рядок був би швидшим, але я пропоную використовувати вбудовані попередньо скомпільовані методи.

Ось швидкий і чистий спосіб швидкої глобальної заміни рядків:

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

І це все.


16
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);

пост silmiar


2
Моє впровадження дещо суворішеstr.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\,\\\^\$\|\#\s]/g, '\\$&')
Андрій Некулау,

8

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

myString.replace(new RegExp(strFind, 'g'), strReplace);

Це найчистіша версія цього, яку я міг знайти. Це має бути прийнятою відповіддю!
счанкам

4

Це регулярний вираз, а не рядок. Використовуйте конструктор для об’єкта RegExp для динамічного створення регулярного виразу.

var r = new RegExp(stringToFind, 'g');
mystring.replace(r, 'some replacement text');

3

Спробуйте:

var stringToFind = "test";
mystring = mystring.replace(new RegExp(stringToFind, "g"), mystring);

Я припускаю, що останній «містринг» у заміні - це не те, що ви мали на увазі?
KooiInc


1

Динамічна глобальна заміна

Я прийшов до цієї теми, шукаючи трохи більш складне рішення, на яке тут немає відповіді. Зараз я знайшов відповідь, тому збираюся опублікувати її на випадок, якщо хтось ще вважатиме її корисною.

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

Наприклад, для написання першої літери всіх слів (наприклад, "котячий килимок" у "Котячий килимок") з використанням глобальної заміни знахідки. Ось як це зробити.

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"

0

Ви можете зробити це за допомогою наступного методу

див. цю функцію:

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 | gi}

де

  • g - глобальна заміна, що враховує регістр
  • gi - це блобальна, нечутлива до заміни

Ви можете перевірити це посилання JSBIN

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.