1

我正在尝试找出正则表达式。我对它相当陌生,我想知道我是否可以只用几行代码来完成以下操作。我试图避免在这里使用 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]);

输出将是这样的: item a and item b have been replaced!

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

4

3 回答 3

4

这是可能的,因为 JavascriptString#replace支持回调,但是您应该将替换收集到一个对象(无法以一种干净的方式获得 know 的值)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];
 });

边注:

您的正则表达式@[a|b]@将匹配@a@and @b@,而且@|@. 使用交替(@(a|b)@,或字符组(@[ab]@)。不要将它们混淆在一起。

于 2013-01-30T08:37:23.153 回答
2

Jan Dvorak 的回答是前进的方向。就像附录一样,他提供的代码可以变得更加“干净”,通过使用替换对象作为闭包对象,因此可以在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 中进行实际的内存管理,你也可以通过闭包和作用域来影响标志和清除垃圾收集器......

于 2013-01-30T08:50:15.837 回答
1

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

string.replace(regex, function (match, group) {
    return window[group];
});

如果可以的话,将它们放在一个对象中,字符串匹配作为键,替换作为值。

我推荐这个正则表达式:

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

http://jsfiddle.net/p4uvW/

于 2013-01-30T08:44:16.080 回答