在对象键中使用正则表达式子模式(使用.replace())

时间:2011-11-14 17:37:17

标签: javascript regex

我对.replace()的工作方式有疑问

我知道我们可以在替换文本中使用子模式,如此

var somestr="foobar";
var newstr = somestr.replace(/foo([a-zA-Z]*)/g,"bar$1")
alert(newstr) //"barbar"

但是,我想知道是否甚至可以在对象属性中使用子模式,就像这样。

var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf'}

var newstr = somestr.replace(/foo([a-zA-Z]*)/g, someobj["$1"])

alert(newstr) //"fuu" ?

我的预期结果是获得'bar'的{​​{1}}属性,即someobj,但实际结果为"fuu",这会导致我相信这是不可能的。

我怎么能以其他方式完成类似的功能呢? 也许你们其中一位JS大师可以对此有所了解。

这背后的真实目的是我有一个模板系统,它使用短标签显示来自请求的JSON对象的数据片段,我试图简化的代码是谁。

2 个答案:

答案 0 :(得分:4)

不是这样,我添加了1美元来显示失败:

var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf', $1: 'test'}

var newstr = somestr.replace(/foo([a-zA-Z]*)/g, someobj["$1"])

newstr; // "test";

但这可行:

var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf', $1: 'test'}

var newstr = somestr.replace(/foo([a-zA-Z]*)/g, "$1")

someobj[newstr]; // fuu

或者可能更好,替换需要一个功能:

var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf', $1: 'test'}

var newstr = somestr.replace(/foo([a-zA-Z]*)/g, function () {
    return someobj[arguments[1]];
})

newstr; // fuu

答案 1 :(得分:0)

你可以这样做:

var someString = "foobar";
var someObject= {bar:'fuu',two:'uuf'};
var re = /foo([a-zA-Z]*)/g;

if (re.test(someString)) {
    alert(someObject[RegExp.$1]);
}

请参阅此处的小提琴,http://jsfiddle.net/nickyt/AjjjP

你也可以这样做alert(someObject[someString.replace(/foo([a-zA-Z]*)/g, "$1")]);,但问题是,如果在$ 1中找不到任何内容,你的对象会查找空字符串键。我会坚持上面的内容。