我一直在搞乱我在推特上看到的东西,这对我来说很有意义,但是没有按预期工作。
为什么第一个例子不起作用? (我的正则表达式可能是错的,但看起来没问题)
我希望我的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评论中的正则表达式。对我不好的粘贴。
答案 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"
这就是为什么这不会起到简写的作用 - 你实际上并没有传递一个函数。