Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据正则表达式搜索结果替换word_Javascript_Regex_Replace - Fatal编程技术网

Javascript 根据正则表达式搜索结果替换word

Javascript 根据正则表达式搜索结果替换word,javascript,regex,replace,Javascript,Regex,Replace,我想弄清楚正则表达式。我对它相当陌生,我想知道我是否可以用几行代码来完成下面的工作。我试图避免在这里使用switch语句,因此我想到了执行以下操作的想法: 首先,让我解释一下这将要做什么:获取一个字符串并用方法中本地已经存在的变量替换键。大概是这样的: var a = 'item a', b = 'item b', string = '@a@ and @b@ have been replaced!', regex = /\@[a|b]\@/g; //now someh

我想弄清楚正则表达式。我对它相当陌生,我想知道我是否可以用几行代码来完成下面的工作。我试图避免在这里使用switch语句,因此我想到了执行以下操作的想法:

首先,让我解释一下这将要做什么:获取一个字符串并用方法中本地已经存在的变量替换键。大概是这样的:

var a = 'item a',
    b = 'item b',
    string = '@a@ and @b@ have been replaced!',
    regex = /\@[a|b]\@/g;

 //now somehow replace this conditionally

 return string.replace(regex, this[replacerResut]);
结果是: a项和b项已被替换


不确定是否可能,但我很想知道一种方法。有两个以上的局部变量,所以你可以看到为什么我不想使用开关,而我的新手说我会这么做!所以我知道这是错误的。我正在尝试编写多态代码。谢谢你的帮助

这是可能的,因为Javascript Stringreplace支持回调,但是您应该收集对一个对象的替换,该对象获取var a的值,因为知道a不可能以干净的方式执行:

var replacement={
      a : 'item a',
      b : 'item b'
    },
    string = '@a@ and @b@ have been replaced!',
    regex = /\@([ab])\@/g; //note the added capturing group


 return string.replace(regex, function(whole, key){
   return replacement[key];
 });
或者:

var a = 'item a',
    b = 'item b',
    string = '@a@ and @b@ have been replaced!',
    regex = /\@[ab]\@/g; 


 var replacement = {"@a@":a, "@b@":b};
 return string.replace(regex, function(whole){
   return replacement[whole];
 });
旁注:


你的regex@[a|b]@将匹配@a@和@b@,但也匹配@a@。可以使用交替字符@a|b@,也可以使用字符组@[ab]@。不要将它们混淆在一起。

这是可能的,因为Javascript Stringreplace支持回调,但是您应该收集对一个对象的替换,该对象获取var a的值,因为知道a不可能以干净的方式执行:

var replacement={
      a : 'item a',
      b : 'item b'
    },
    string = '@a@ and @b@ have been replaced!',
    regex = /\@([ab])\@/g; //note the added capturing group


 return string.replace(regex, function(whole, key){
   return replacement[key];
 });
或者:

var a = 'item a',
    b = 'item b',
    string = '@a@ and @b@ have been replaced!',
    regex = /\@[ab]\@/g; 


 var replacement = {"@a@":a, "@b@":b};
 return string.replace(regex, function(whole){
   return replacement[whole];
 });
旁注:


你的regex@[a|b]@将匹配@a@和@b@,但也匹配@a@。可以使用交替字符@a|b@,也可以使用字符组@[ab]@。不要把它们混淆在一起。

如果它们不是使用window的局部变量,这是可以做到的,尽管我称之为邪恶:

string.replace(regex, function (match, group) {
    return window[group];
});
如果可以,将它们放在一个对象中,字符串匹配作为键,替换项作为值

我推荐这个正则表达式:

regex = /@(\w+?)@/g;

如果它们不是使用window的局部变量,则可以这样做,尽管我称之为邪恶:

string.replace(regex, function (match, group) {
    return window[group];
});
如果可以,将它们放在一个对象中,字符串匹配作为键,替换项作为值

我推荐这个正则表达式:

regex = /@(\w+?)@/g;

简·德沃夏克的答案是前进的道路。就像附录一样,他提供的代码可以通过使用替换对象(closure对象)变得更干净,因此可以在replace调用返回后对其进行GC:

string.replace(expression, (function()
{
    var replacement = {a: 'item a',
                       b: 'item b'};
    return function(match)
    {//the actual callback
        return replacement[match];
    };
}()));//IIFE
//console.log(replacement);//undefined, can't be referenced anymore and may be flagged for GC

你不必走这么远,但你要知道:即使你不能在JS中进行实际的内存管理,你也可以通过闭包和作用域来影响flag&sweep垃圾收集器…

Jan Dvorak的答案是前进的方向。就像附录一样,他提供的代码可以通过使用替换对象(closure对象)变得更干净,因此可以在replace调用返回后对其进行GC:

string.replace(expression, (function()
{
    var replacement = {a: 'item a',
                       b: 'item b'};
    return function(match)
    {//the actual callback
        return replacement[match];
    };
}()));//IIFE
//console.log(replacement);//undefined, can't be referenced anymore and may be flagged for GC

你不必走这么远,但你要知道:即使你不能在JS中进行实际的内存管理,你也可以通过闭包和作用域来影响flag&sweep垃圾收集器…

如果a、b等必须是变量而不是数组,那是没有办法的,因为JS中没有变量。如果它们可以是数组/对象值,这是可能的。如果a、b等必须是变量而不是数组,那就没有办法了,因为JS中没有变量。如果它们可以是数组/对象值,这是可能的。即使使用局部变量也可以做到,但它仍然比窗口[组]更邪恶。首先建议使用window[group],然后建议使用/@\w+?@/。是否确实要使所有全局变量都可替换为字符串?另请注意,这在浏览器环境之外不起作用。如果希望更通用,可以捕获全局变量this:var global=this@JanDvorak哇,慢点。我说那是邪恶的;他应该真正使用对象或数组。如我所述,使用window[group]并不是相互排斥的。请仔细阅读我的答案。请注意replace方法中如何存在变量regex。你认为这应该是什么?即使使用局部变量也可以做到,但它仍然比窗口[组]更邪恶。首先建议使用window[group],然后建议使用/@\w+?@/。是否确实要使所有全局变量都可替换为字符串?另请注意,这在浏览器环境之外不起作用。如果希望更通用,可以捕获全局变量this:var global=this@JanDvorak哇,慢点。我说那是邪恶的;他应该真正使用对象或数组。如我所述,使用window[group]并不是相互排斥的。请仔细阅读我的答案。请注意replace方法中如何存在变量regex。您认为应该是什么?我希望初始范围足够合理,这样就不会出现名称空间混乱。另外,如果替换对象这么小,我不担心内存使用。如果替换对象可能很大,并且您仅在希望避免重新创建对象mul时进行替换,那么这仍然是一个好注意事项
好几次了。@JanDvorak:我同意你的看法,我并不是想在这里把这种关闭方法作为更好的选择,远远不是。你的是我投的票。正如您所说,如果替换对象很大,这种方法可以让您对内存管理进行某种形式的控制。我没有注意到replacement对象的作用域是一个生命。不知怎的,我讨厌IIFEs归还任何东西。@JanDvorak:啊,好吧。。。我喜欢这个。个人喜好,我想。。。模块模式,闭包,喜欢它们,尽管我必须承认,如果忘记记录所有内容,有时代码的可维护性确实会降低:我想我必须停止忘记iLife中的E意味着什么:-我希望初始范围足够合理,这样就不会发生命名空间混乱。另外,如果替换对象这么小,我不担心内存使用。如果替换对象可能很大,而您只进行一次替换,这仍然是一个好注意事项。您可能希望避免多次重新创建对象。@JanDvorak:我同意您的看法,我并不想在这里将此闭包方法作为更好的替代方法,远远不是。你的是我投的票。正如您所说,如果替换对象很大,这种方法可以让您对内存管理进行某种形式的控制。我没有注意到replacement对象的作用域是一个生命。不知怎的,我讨厌IIFEs归还任何东西。@JanDvorak:啊,好吧。。。我喜欢这个。个人喜好,我想。。。模块模式,闭包,喜欢它们,尽管我必须承认,如果你忘记记录所有东西,有时代码的可维护性确实会降低:我想我必须停止忘记生活中的E意味着什么:-简,你这个人!非常感谢你的帮助。最后我同意了你的第一个建议!只是在“替换整个零件”返回替换中做了一个小改动[whole.replace/@/g,];为了清除“我一直得到一个未定义的变量”,然后意识到它正在寻找一个带有替换项的变量[@a@],没有你的朋友,我不可能做到这一点!再次感谢!第一个版本不寻求替换[a]。我刚查过。第二个版本是这样的,但我已经解释清楚了。简,你就是那个人!非常感谢你的帮助。最后我同意了你的第一个建议!只是在“替换整个零件”返回替换中做了一个小改动[whole.replace/@/g,];为了清除“我一直得到一个未定义的变量”,然后意识到它正在寻找一个带有替换项的变量[@a@],没有你的朋友,我不可能做到这一点!再次感谢!第一个版本不寻求替换[a]。我刚查过。第二个版本有,但我已经解释了。