javascript正则表达式捕获括号
在处理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
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,