使用正则表达式了解替换

时间:2014-09-03 13:17:22

标签: javascript regex

我想删除所有尾随和前导破折号(-),并用JavaScript替换任何重复短划线,否则替换。我已经开发了一个正则表达式:

"----asdas----asd-as------q---".replace(/^-+()|()-+$|(-)+/g,'$3')

它有效:

asdas-asd-as-q

但我不理解$3部分(通过绝望的实验获得)。为什么不$1

4 个答案:

答案 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表示第三个被捕获的子模式,即。第三组括号。

然而,就个人而言,我会将其视为两个操作,并按原样执行:

  1. 修剪前导和尾随- s
  2. 压缩重复- s
  3. 像这样:

    "----asdas----asd-as------q---".replace(/^-+|-+$/g,"").replace(/--+/g,"-");
    

    这种概念可能意味着更多的代码,但我相信它可以让您更容易阅读和理解这里发生的事情,因为您一次只做一件事,而不是一次性做所有事情。

答案 3 :(得分:1)

$是正在组建的替代团体。

参见演示。

http://regex101.com/r/pP3pN1/25

在右侧,您可以看到由()生成的组。

替换并查看。在您的情况下,$ 1为空。