难以理解?:,?=,?!和反向引用。 。

时间:2011-01-10 21:29:08

标签: javascript regex

我正在学习关于脚本的正则表达式,我将在路上写下来,但我已经到了一个停止点。我基本上了解?=?!做了什么,他们是“向前看”。借用和示例:/Win (?=98)/仅匹配“Win”,如果后跟“98”,而/Win (?!XP)/仅匹配“Win”,只有不是后跟“XP” “。 。 。正确?

现在我真的没有得到?:分隔符。我还没有找到一个很好的例子,我真的非常,真的很困惑。 :/我明白它应该匹配整个包含的模式或什么?

我很困惑的另一件事是反向引用。这是我发现的例子:正则表达式/<(\S+).*>(.*)<\/\1>/应该匹配“任何标签”。我只是对浏览器的数字“1”感到困惑。 。 。它是第一场比赛 - 在这种情况下,我认为它会引用<字符 - 或其他什么?

我现在刚刚涉足正则表达的世界,并希望对这些概念做一些澄清,谢谢大家提前!

2 个答案:

答案 0 :(得分:5)

您对前瞻断言的看法是正确的。

\1指的是括号中的第一个子匹配,即您示例中(\S+)匹配的任何内容。 \2指的是第二个(在示例中,(.*)),依此类推。

另一方面,

?:意味着该组括号不应与\1之类的引用相关联。如果您需要括号,但是之后并不真正关心获取匹配的文本,则可以使用它。因此,在正则表达式/(?:abc)def(ghi)/中,\1不会扩展为abc(因为我们使用?:将其关闭),而是ghi。< / p>

答案 1 :(得分:0)

  

现在我真的没有得到?:分隔符。我还没有找到一个很好的例子,我真的非常,真的很困惑。 :/我明白它应该匹配整个包含的模式或什么?

?:运算符允许您对正则表达式的各个部分进行分组(就像裸括号一样),不用捕获它们。事实上,它基本上被称为“非捕获组”。

例如:

/^(.*?)(foo|bar)(.*?)$/

结果:第一个捕获组包含匹配前的文本,第二个包含“foo”或“bar”,第三个包含其余部分。

/^(.*?)(?:foo|bar)(.*?)$/

结果:第一个捕获组包含匹配前的文本,第二个包含后面的文本。