javascript正则表达式捕获括号

javascript正则表达式捕获括号,javascript,regex,replace,str-replace,Javascript,Regex,Replace,Str Replace,在处理javascript正则表达式时,我并不真正理解这个概念。我不明白为什么下面的例子需要括号 var x = "{xxx} blah blah blah {yyy} and {111}"; x.replace( /{([^{}]*)}/g , function(match,content) { console.log(match,content); return "whatever"; }); //it wi

在处理javascript正则表达式时,我并不真正理解这个概念。我不明白为什么下面的例子需要括号

var x = "{xxx} blah blah blah {yyy} and {111}";
x.replace( /{([^{}]*)}/g , 
          function(match,content) {
               console.log(match,content);
               return "whatever";
});

//it will print
{xxx} xxx
{yyy} yyy
{111} 111
因此,当我从模式
x
中删除括号时,结果会给出不同的值

x.replace( /{[^{}]*}/g , 
          function(match,content) {
               console.log(match,content);
               return "whatever";
});

//it will print
{xxx} 0
{yyy} 37
{111} 49
所以内容值现在变成了数值,我不知道为什么。有人能解释一下幕后发生了什么吗?

根据,函数的参数将依次为:

  • 匹配的子字符串
  • 定义的任何组(如果有)
  • 原始字符串中找到匹配项的索引
  • 原始字符串
因此,在第一个示例中,
content
将是组1中捕获的字符串。但在第二个示例中删除组时,
content
实际上是找到匹配项的索引。

根据,函数的参数将依次为:

  • 匹配的子字符串
  • 定义的任何组(如果有)
  • 原始字符串中找到匹配项的索引
  • 原始字符串
因此,在第一个示例中,
content
将是组1中捕获的字符串。但在第二个示例中删除组时,
内容实际上是找到匹配项的索引。

数字:

所选总字符串中匹配子字符串的偏移量 检查。(例如,如果总字符串为“abcd”,则 匹配的子字符串为“bc”,则此参数为1。)

资料来源:

“将函数指定为参数”部分

数字:

所选总字符串中匹配子字符串的偏移量 检查。(例如,如果总字符串为“abcd”,则 匹配的子字符串为“bc”,则此参数为1。)

资料来源:


“将函数指定为参数”部分的括号仅用于捕获/替换匹配的一部分。例如,当我使用它来匹配可能有或可能没有分机的电话号码时。此函数匹配整个字符串(如果
if
正确),因此整个字符串将被替换,但我仅使用特定顺序的特定类型的字符,输入中允许空白或其他(()-x)字符

如果给定6512589631x1234或1 651 258 9631 1234,它将始终输出格式化为(651)258-9631 x1234的字符串。它也不允许(或者在本例中是格式)免费电话号码,因为我的领域不允许使用这些号码

function phoneNumber(v) {
// take in a string, return a formatted string (651) 651-6511 x1234
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi) !== -1) {return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi,"($1) $2-$3 x$4"); }
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi) !== -1) { return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi,"($1) $2-$3"); }
return v;
}
这使我能够收集区号、前缀、行号和可选扩展名,并按照我需要的方式进行格式化(例如,对于无法按照说明操作的用户)

因此,如果您输入6516516511x1234或“(651)651-6511x1234”,它将匹配本例中的一个或另一个正则表达式


现在,代码中发生的事情如前所述——返回每个匹配开始的索引。通过
match
更好地服务于您对该代码的使用,例如一个(返回的文本),或
搜索索引,如示例二。答案扩大了

括号仅用于捕获/替换匹配的一部分。例如,当我使用它来匹配可能有或可能没有分机的电话号码时。此函数匹配整个字符串(如果
if
正确),因此整个字符串将被替换,但我仅使用特定顺序的特定类型的字符,输入中允许空白或其他(()-x)字符

如果给定6512589631x1234或1 651 258 9631 1234,它将始终输出格式化为(651)258-9631 x1234的字符串。它也不允许(或者在本例中是格式)免费电话号码,因为我的领域不允许使用这些号码

function phoneNumber(v) {
// take in a string, return a formatted string (651) 651-6511 x1234
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi) !== -1) {return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi,"($1) $2-$3 x$4"); }
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi) !== -1) { return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi,"($1) $2-$3"); }
return v;
}
这使我能够收集区号、前缀、行号和可选扩展名,并按照我需要的方式进行格式化(例如,对于无法按照说明操作的用户)

因此,如果您输入6516516511x1234或“(651)651-6511x1234”,它将匹配本例中的一个或另一个正则表达式


现在,代码中发生的事情如前所述——返回每个匹配开始的索引。通过
match
更好地服务于您对该代码的使用,例如一个(返回的文本),或
搜索索引,如示例二。答案扩大了

这对于替换文本很有用

例如,我有一个字符串“一二三四”,我想像“四三二一”一样反转。为了实现这一点,我将使用以下代码行:

var reversed = "one two three four".replace(/(one) (two) (three) (four)/, "$4 $3 $2 $1");
请注意$n如何表示字符串中的每个单词

另一个例子:我有相同的字符串“一二三四”,我想把每个单词打印两次:

var eachWordTwice = "one two three four".replace(/(one) (two) (three) (four)/, "$1 $1 $2 $2 $3 $3 $4 $4");

这对于替换文本很有用

例如,我有一个字符串“一二三四”,我想像“四三二一”一样反转。为了实现这一点,我将使用以下代码行:

var reversed = "one two three four".replace(/(one) (two) (three) (four)/, "$4 $3 $2 $1");
请注意$n如何表示字符串中的每个单词

另一个例子:我有相同的字符串“一二三四”,我想把每个单词打印两次:

var eachWordTwice = "one two three four".replace(/(one) (two) (three) (four)/, "$1 $1 $2 $2 $3 $3 $4 $4");

第二个代码将输出0,21,31,这是匹配项的索引(不是您提供的)。第二个代码将输出0,21,31,这是匹配项的索引(不是您提供的),这是一个哑接口(允许中间有可变参数),但实际上是这样的。。这就解释了观察到的行为。函数(match,p1,offset,string)是/{([^{}]*)}/g的正确函数,而函数(match,offset,string)是/{[^{}]*}/g的正确函数。希望这是有意义的。这是一个愚蠢的接口(允许可变参数在中间),但它就是这样。。这解释了观察到的行为。函数(match,p1,offset,string)是/{([^{}]*)}/g的正确函数,而函数(match,