正则表达式分组和上下文

时间:2012-03-19 16:11:22

标签: javascript regex

我一直在搞乱我在推特上看到的东西,这对我来说很有意义,但是没有按预期工作。

为什么第一个例子不起作用? (我的正则表达式可能是错的,但看起来没问题)

我希望我的toUpperCase调用的上下文是该组,并且是第二个示例的简写版本。

var output = "james".replace(/(^.+?)/,"".toUpperCase.call("$1"));


var output2 = "james".replace(/(^.+?)/,function(a){

    return "".toUpperCase.call(a);

    });

console.log(output); // outputs james
console.log(output2); // outputs James

编辑 我修复了M42评论中的正则表达式。对我不好的粘贴。

2 个答案:

答案 0 :(得分:2)

第一个例子不起作用,因为没有匹配(即名称周围没有parens)。并且不能在一些字符之后放置hanchor ^

你的正则表达式:

/    : delimiter
\(   : open parens
(    : begining of group 1
^    : start of string
.+?  : one or more char non greedy
)    : end of group 1
\)   : close parens
/    : delimiter

这与james不匹配,因此没有替换或upperCased

答案 1 :(得分:2)

@ M42是正确的,因为没有理由你的第一个正则表达式匹配“詹姆斯”。但修复它也不会起作用:

var output = "james".replace(/(^.+?)/,"".toUpperCase.call("$1"));
console.log(output); // outputs james

那是因为replace()的第二个参数有两个选项:字符串或函数。如果它是一个字符串,那么“$ 1”将被第一个匹配替换(依此类推)。如果它是一个函数,那么第一个参数将是第一个匹配(依此类推)。

在第二个示例中,您正在使用函数参数,并正确地将第一个匹配作为参数。但是在你的第一个例子中,你传递了函数调用"".toUpperCase.call("$1")结果 - 当你运行它时,返回字符串"$1"。所以第一个例子实际上是为"$1"使用字符串参数.replace(),它除了用自身替换字符串中的第一个匹配外什么都不做:

"james".replace(/(^.+?)/,"$1"); // "james"

这就是为什么这不会起到简写的作用 - 你实际上并没有传递一个函数。