我正试图找出正则表达式。我是相当新的,我想知道我是否可以用几行代码来完成以下操作。我试图避免在这里使用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!
不确定是否可能,但很想知道这样做的方法。有两个以上的局部变量,所以你可以看到为什么我不想使用开关,而我的新人说这就是我要做的!所以我知道这是错的。我正在尝试编写多态代码。谢谢你的帮助!
答案 0 :(得分:4)
有可能,因为Javascript String#replace
支持回调,但您应该收集一个对象的替换(获取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@
和@b@
,还会匹配@|@
。使用替换(@(a|b)@
或字符组(@[ab]@
)。不要将它们混淆在一起。
答案 1 :(得分:2)
Jan Dvorak的回答是前进的方向。就像附录一样,通过使用替换对象一个闭包对象,他提供的代码甚至可以成为“cleaner”,因此可以在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中进行实际的内存管理,你也可以影响旗帜&通过封闭和范围扫除垃圾收集器......
答案 2 :(得分:1)
如果它们不是使用window
的局部变量,可以这样做(虽然我称之为邪恶):
string.replace(regex, function (match, group) {
return window[group];
});
如果可以的话,将它们放在一个对象中,字符串匹配为键,替换为值。
我推荐这个正则表达式:
regex = /@(\w+?)@/g;