我想删除所有尾随和前导破折号(-
),并用JavaScript替换任何重复短划线,否则替换。我已经开发了一个正则表达式:
"----asdas----asd-as------q---".replace(/^-+()|()-+$|(-)+/g,'$3')
它有效:
asdas-asd-as-q
但我不理解$3
部分(通过绝望的实验获得)。为什么不$1
?
答案 0 :(得分:3)
因为有3个捕获组。 (两个冗余空的和(-)
)。 $3
替换为与第三组匹配的字符串。
如果删除前两个空捕获组,则可以使用$1
。
"----asdas----asd-as------q---".replace(/^-+|-+$|(-)+/g, '$1')
// => "asdas-asd-as-q"
答案 1 :(得分:3)
您实际上可以在没有任何捕获组的情况下使用它:
"----asdas----asd-as------q---".replace(/^-+|-+$|-+(?=-)/g, '');
//=> "asdas-asd-as-q"
此处-+(?=-)
是正向前瞻,确保匹配除匹配中的最后一个-
之外的一个或多个连字符。
答案 2 :(得分:2)
正如其他答案所说,$3
表示第三个被捕获的子模式,即。第三组括号。
然而,就个人而言,我会将其视为两个操作,并按原样执行:
-
s -
s 像这样:
"----asdas----asd-as------q---".replace(/^-+|-+$/g,"").replace(/--+/g,"-");
这种概念可能意味着更多的代码,但我相信它可以让您更容易阅读和理解这里发生的事情,因为您一次只做一件事,而不是一次性做所有事情。
答案 3 :(得分:1)