在Javascript中,如何使用'/'和'/ g'内部的变量对字符串执行全局替换?


75

我想在Javascript中使用String.replace执行字符串的全局替换。

在文档中,我读到我可以使用/ 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/...
埃里克·温德林

Answers:


-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"

它还将使用正则表达式。对我来说,这是解决问题的一种更优雅的方法。prototypejs gsub文档


15
有一个很多简单的解决方案实际上相当有效:myStr.split('a').join('g')。也不要求prototype.js。
cloudfeet

2
这不是一个有用的答案,因为可以通过简单的符合标准的方法来完成同一件事。
rmcclellan 2014年

@cloudfeet:您的解决方案确实是一个非常简单的解决方案,但只是想知道哪种解决方案会更有效-使用RegExp对象(下面是Paolo Bergantino的解决方案)还是您的解决方案可以动态创建一个数组,然后加入数组元素?
Mandeep Singh's

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');。但。如果“查找”包含正则表达式中的特殊字符,则它们将具有正则表达式的含义。因此,如果您尝试替换“。” 在带有'x'的'abc.def'中,您会得到'xxxxxxx'-糟糕。

如果您只需要简单的字符串替换,就不需要正则表达式!这是纯字符串替换习惯用法:

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

2
+1总是很高兴看到人们思考问题的字面意义之外。
托马斯,

我想知道与RegExp()调用相比,这对于较大的字符串如何降低性能?
加藤

3
@Kato我也很好奇,所以我创建了一个jsperf性能测试来找出答案。链接:goo.gl/cbZiV
starbeamrainbowlabs

1
只要检查Firefox,正则表达式是最快的。(我之前使用的是chrome)
starbeamrainbowlabs 2013年

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 Post


2
我的实现是严格一些的str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\,\\\^\$\|\#\s]/g, '\\$&')
安德烈Neculau

8

您可以使用以下解决方案对在'/'和'/ g'内的变量的字符串执行全局替换:

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

这是我能找到的最干净的版本。这应该是公认的答案!
schankam '18 -10-11

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

我想替换中的最后一个“ mystring”不是您的意思吗?
KooiInc,


1

动态全局替换

我来到这个线程中寻找一个稍微复杂的解决方案,这里没有解决。我现在已经找到了答案,因此我将其发布,以防其他人发现它有用。

我想做一个动态的全局替换,替换字符串基于原始匹配。

例如,用全局查找替换将所有单词的首字母大写(例如,“ 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"

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,输出

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.