JavaScript正则表达式基础知识

时间:2014-07-31 11:36:05

标签: javascript regex

我正在尝试学习正则表达式,目前我从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)。

2 个答案:

答案 0 :(得分:8)

第一个

  • (.)匹配并捕获单个字符到组1,因此(.)\1匹配两个相同的字符,例如AA
  • 在字符串中,此模式的唯一匹配是bb
  • 通过第1组捕获缓冲区bb替换这两个字符$1,即b, we replace two chars with one, effectively removing one b`。

第二个

  • 再次(.)匹配并捕获单个字符,将其捕获到第1组。
  • 模式依次匹配字符串中的每个字符。
  • 替换是第1组捕获缓冲区$1,因此我们用自己替换每个字符。因此字符串不变。

第三个

  • 在这里,暂时忘记括号,.*匹配整个字符串:这是匹配。
  • 量词*表示每次匹配单个字符时都会重置组1(未创建新的组号,因为组编号从左到右完成)。
  • 对于匹配的每个字符,该字符因此被捕获到第1组 - 直到下一次捕获重置第1组。
  • 第1组的结束值是最后一次捕获,即最后一个字符c
  • 我们将匹配(即整个字符串)替换为组1(即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倍”并将其替换为参考。因此任何加倍的字符都会匹配并被引用替换。