以下是代码:
我认为以下示例将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会是什么?
答案 0 :(得分:1)
我经常使用https://regex101.com/和https://www.debuggex.com/来解释正则表达式。
这就是Debuggex如何解释有问题的表达方式
此外,如果您在Chrome控制台中调试此功能,那么您应该获得
我希望这可以帮助您更好地理解
答案 1 :(得分:1)
模式([^\d]*)(\d*)([^\w]*)
用于匹配输入字符串abc12345#$*%
的三个。
([^\d]*)
- 使用否定[^]
匹配任何非数字零次或多次,在本例中为abc
。(\d*)
- 匹配前一个捕获组后面的零个或多个数字[0-9]
,在本例中为12345
。([^\w]*)
- 匹配前一个捕获组之后的集合[A-Za-z0-9_]
中没有的任何字符,所以非常特殊的字符。在这种情况下#$*%
。您的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)
([^\d]*)
匹配0或更多非。它可以写成([\D]*)
(\d*)
匹配0位或更多位数([^\w]*)
匹配0个或更多非字符。它可以写成([\W]*)
如需更好的解释,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace