我正在尝试学习正则表达式,目前我从W3,Mozilla或http://www.regular-expressions.info/的所有概述中收集了一个非常基本的理解,但是当我探索这个wikibook时{{3}它给出了这个例子:
"abbc".replace(/(.)\1/g, "$1") => "abc"
我不知道为什么是真的(wikibook没有真正解释),但我自己尝试了,它确实放弃了第二个b。我知道\ 1是对被捕获组(。)的反向引用,但是。是一个除了新线符号之外的任何字符......那还不是第二个b吗?尝试一些变化并没有解决问题......
"abbc".replace(/(.)/g, "$1") => "abbc"
"aabc".replace(/(.)*/g, "$1") => "c"
有没有人对Javascript正则表达式有一个很好的深度教程(我看过几本书,它们对于大约15种语言非常普遍,并且没有真正强调Javascript)。
答案 0 :(得分:8)
第一个
(.)
匹配并捕获单个字符到组1,因此(.)\1
匹配两个相同的字符,例如AA
。 bb
。 bb
替换这两个字符$1
,即b, we replace two chars with one, effectively removing one
b`。第二个
(.)
匹配并捕获单个字符,将其捕获到第1组。$1
,因此我们用自己替换每个字符。因此字符串不变。 第三个
.*
匹配整个字符串:这是匹配。 *
表示每次匹配单个字符时都会重置组1(未创建新的组号,因为组编号从左到右完成)。c
c
),因此替换字符串为c
。群组编号的细节非常重要,我强烈建议您阅读关于"血腥细节"的链接文章。
<强>参考强>
答案 1 :(得分:0)
分解时这很简单:
With "abbc".replace(/(.)\1/g, "$1"), the result is "abc" because:
(.) references one character.
\1 references the first back reference
所以它说的是“找到相同字母的2倍”并将其替换为参考。因此任何加倍的字符都会匹配并被引用替换。