1

在处理 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

所以内容值现在变成了我不知道为什么的数值。有人可以解释幕后发生的事情吗?

4

4 回答 4

4

根据MDN 文档,该函数的参数将按顺序排列:

  • 匹配的子字符串。
  • 已定义的任何组(如果有)。
  • 找到匹配项的原始字符串中的索引。
  • 原始字符串。

所以在第一个示例中,content将是组 1 中捕获的字符串。但是当您在第二个示例中删除组时,content实际上是找到匹配项的索引。

于 2013-10-22T22:07:53.510 回答
1

这对于替换文本很有用。

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

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");
于 2014-05-24T17:07:43.983 回答
0

括号仅用于捕获/替换匹配的一部分。例如,当我使用它来匹配可能有或没有分机的电话号码时。这个函数匹配整个字符串(如果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-6511 x1234”,它将匹配此示例中的一个或另一个正则表达式。

现在您的代码中发生的事情就像@amine-hajyoussef所说的那样 - 正在返回每场比赛开始的索引。match例如一个(返回search的文本)或索引(如示例二)可以更好地为您使用该代码提供服务。pswg 的答案扩大了。

于 2013-10-22T22:20:56.173 回答
0

号码:

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

资源:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

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

于 2013-10-22T22:08:10.710 回答