这个捕获组在Javascript的replace函数文档中的正则表达式中做什么?

这个捕获组在Javascript的replace函数文档中的正则表达式中做什么?,javascript,regex,Javascript,Regex,代码如下: 我认为以下示例将newString设置为: “abc-12345-#$*%”: 我不确定3个捕获组在正则表达式中做什么?第一个比喻: ([^/d]*) 捕获所有不是数字的东西 第二组是否捕获了所有数字 第三组是否捕获所有非字母数字字符(字母或数字) 传递给replacer函数的是什么?如果replace函数中的replace函数没有收到任何参数,那么p1p2和p3是什么 ([^\d]*)匹配0个或多个非匹配项。它可以写成([\D]*) (\d*)匹配0个或更多数字 ([^\w]*)

代码如下:

我认为以下示例将newString设置为:

“abc-12345-#$*%”:

我不确定3个捕获组在正则表达式中做什么?第一个比喻:

([^/d]*)
捕获所有不是数字的东西

第二组是否捕获了所有数字

第三组是否捕获所有非字母数字字符(字母或数字)

传递给replacer函数的是什么?如果replace函数中的replace函数没有收到任何参数,那么p1p2和p3是什么

  • ([^\d]*)
    匹配0个或多个非匹配项。它可以写成
    ([\D]*)
  • (\d*)
    匹配0个或更多数字
  • ([^\w]*)
    匹配0个或多个非字符。它可以写成
    ([\W]*)
  • 传递给replacer函数的参数包括:匹配的子字符串、每个捕获的组(如果未捕获任何内容,则传递一个空字符串)、必须检查字符串的偏移量(最后一个参数)
  • 有关更好的解释,请参见:

    我经常使用和来解释正则表达式

    这就是Regex101如何解释所讨论的表达式

    Debuggex就是这样解释这个表达式的

    此外,如果您在Chrome控制台中调试,这也是您应该得到的

    我希望这有助于您更好地理解这一点

    模式
    ([^\d]*)(\d*)([^\w]*)
    用于匹配输入字符串的三段

  • ([^\d]*)
    -使用否定匹配任何非数字零次或多次,在本例中为
    abc
  • (\d*)
    -匹配上一个捕获组后面的零个或多个数字
    [0-9]
    ,在本例中为
    12345
  • ([^\w]*)
    -匹配前一个捕获组之后的集合中未包含的任何字符,因此非常特殊。在这种情况下,
    #$*%
  • 您的
    replacer
    函数实际上并没有替换那些捕获组,而是保留它们并在它们之间放置破折号
    -

    因为有三个捕获组(如上所述),所以三个参数
    p1-p3
    表示这些捕获组

    函数参数是基于模式中捕获组的数量动态填充的(JavaScript的一部分)。因此,如果您有4个捕获组,那么将有四个捕获组参数:

    function replacer(match, p1, p2, p3, p4, offset, string) { ... }
    
    参数名称显然并不重要,只是在函数中调用它们的任何内容

    replacer
    函数接受三个捕获组参数并返回以下内容:
    [p1、p2、p3]。join('-')
    。这只是将
    -
    (两边都有空格)放在捕获组之间,并返回
    abc-12345-#$*%

    进一步阅读
    join
    函数:

    function replacer(match, p1, p2, p3, p4, offset, string) { ... }