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

时间:2015-10-29 17:38:35

标签: javascript regex

以下是代码:

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

  

'abc - 12345 - #$ *%':

function replacer(match, p1, p2, p3, offset, string) {
  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
  return [p1, p2, p3].join(' - ');
}

var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);

我不确定3个捕获组在正则表达式中的作用是什么?是第一个假设:

([^/d]*)

捕获所有不是数字的东西?

第二组是否捕获了数字的所有内容?

第三组是否捕获了不是字母数字字符(字母或数字)的所有内容?

什么被传递到更换器功能?如果replace函数中的replacer函数没有收到任何参数,p1 p2和p3会是什么?

3 个答案:

答案 0 :(得分:1)

我经常使用https://regex101.com/https://www.debuggex.com/来解释正则表达式。

这就是Regex101如何解释有问题的表达方式 Regex101

这就是Debuggex如何解释有问题的表达方式 Regular expression visualization

Debuggex

此外,如果您在Chrome控制台中调试此功能,那么您应该获得Chrome

我希望这可以帮助您更好地理解

答案 1 :(得分:1)

模式([^\d]*)(\d*)([^\w]*)用于匹配输入字符串abc12345#$*%三个

  1. ([^\d]*) - 使用否定[^]匹配任何非数字零次或多次,在本例中为abc
  2. (\d*) - 匹配前一个捕获组后面的零个或多个数字[0-9],在本例中为12345
  3. ([^\w]*) - 匹配前一个捕获组之后的集合[A-Za-z0-9_]中没有的任何字符,所以非常特殊的字符。在这种情况下#$*%
  4. 您的replacer函数实际上并未替换这些捕获组,但是保留它们并在它们之间放置短划线-

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

    函数参数动态填充,具体取决于模式中捕获组的数量(JavaScript的悠闲性质的一部分)。因此,如果您有4个捕获组,则会有四个捕获组参数:

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

    而且参数名称显然不重要,只要你想在函数中调用它们。

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

    进一步阅读join函数:Array.prototype.join()

答案 2 :(得分:-1)

  1. ([^\d]*)匹配0或更多。它可以写成([\D]*)
  2. (\d*)匹配0位或更多位数
  3. ([^\w]*)匹配0个或更多非字符。它可以写成([\W]*)
  4. 传递给replacer函数的参数是:匹配的子字符串,每个捕获的组(如果没有捕获任何空字符串被传递),必须检查字符串的偏移量(最后一个参数)
  5. 如需更好的解释,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace