Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式分组与上下文_Javascript_Regex - Fatal编程技术网

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"

这就是为什么这不能作为一个速记——实际上你没有传递一个函数。

你的意思是正则表达式是错误的吗?如果是这样的话,你能详细介绍一下吗?干杯。我没有注意到我为第一个正则表达式粘贴了错误的值。我的意思是它们是一样的。你的意思是正则表达式错了吗?如果是这样的话,你能详细介绍一下吗?干杯。我没有注意到我为第一个正则表达式粘贴了错误的值。我的意思是他们都是一样的。。我脑子里想得不对。有时候会有一些棘手的事情。啊,对了。。我脑子里想得不对。有时是棘手的事情。