Javascript 正则表达式分组与上下文
我在推特上看到了一些东西,这些东西对我来说是有意义的,但并没有达到预期效果 为什么第一个示例不起作用?(我想我的正则表达式可能是错的,但看起来还可以) 我希望我的Javascript 正则表达式分组与上下文,javascript,regex,Javascript,Regex,我在推特上看到了一些东西,这些东西对我来说是有意义的,但并没有达到预期效果 为什么第一个示例不起作用?(我想我的正则表达式可能是错的,但看起来还可以) 我希望我的toUpperCase调用的上下文是组,是第二个示例的速记版本 var output = "james".replace(/(^.+?)/,"".toUpperCase.call("$1")); var output2 = "james".replace(/(^.+?)/,function(a){ return "".to
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
Edit我修复了M42注释中的正则表达式。粘贴不好。第一个示例不起作用,因为没有匹配项(即名称周围没有括号)。此外,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不匹配,因此没有替换或大写第一个示例不起作用,因为没有匹配(即名称周围没有括号)。此外,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
不匹配,因此没有替换或大写的@M42是正确的,因为您的第一个正则表达式没有理由与“james”匹配。但修复它也不起作用:
var output = "james".replace(/(^.+?)/,"".toUpperCase.call("$1"));
console.log(output); // outputs james
这是因为replace()
的第二个参数有两个选项:字符串或函数。如果是字符串,则“$1”将替换为第一个匹配项(依此类推)。如果它是一个函数,那么第一个参数将是第一个匹配项(依此类推)
在第二个示例中,您使用的是函数参数,并且正确地获得了第一个匹配项作为参数。但在第一个示例中,您传递的是函数调用“”.toUpperCase.call(“$1”)
——运行该函数时,返回字符串“$1”
。因此,第一个示例实际上使用了.replace()
的字符串参数“$1”
,它只会将字符串中的第一个匹配项替换为自身:
"james".replace(/(^.+?)/,"$1"); // "james"
这就是为什么它不能作为一个速记工具工作的原因——您实际上并没有传入函数。@M42是正确的,因为您的第一个正则表达式没有理由与“james”匹配。但修复它也不起作用:
var output = "james".replace(/(^.+?)/,"".toUpperCase.call("$1"));
console.log(output); // outputs james
这是因为replace()
的第二个参数有两个选项:字符串或函数。如果是字符串,则“$1”将替换为第一个匹配项(依此类推)。如果它是一个函数,那么第一个参数将是第一个匹配项(依此类推)
在第二个示例中,您使用的是函数参数,并且正确地获得了第一个匹配项作为参数。但在第一个示例中,您传递的是函数调用“”.toUpperCase.call(“$1”)
——运行该函数时,返回字符串“$1”
。因此,第一个示例实际上使用了.replace()
的字符串参数“$1”
,它只会将字符串中的第一个匹配项替换为自身:
"james".replace(/(^.+?)/,"$1"); // "james"
这就是为什么这不能作为一个速记——实际上你没有传递一个函数。你的意思是正则表达式是错误的吗?如果是这样的话,你能详细介绍一下吗?干杯。我没有注意到我为第一个正则表达式粘贴了错误的值。我的意思是它们是一样的。你的意思是正则表达式错了吗?如果是这样的话,你能详细介绍一下吗?干杯。我没有注意到我为第一个正则表达式粘贴了错误的值。我的意思是他们都是一样的。。我脑子里想得不对。有时候会有一些棘手的事情。啊,对了。。我脑子里想得不对。有时是棘手的事情。