我正在学习关于脚本的正则表达式,我将在路上写下来,但我已经到了一个停止点。我基本上了解?=
和?!
做了什么,他们是“向前看”。借用和示例:/Win (?=98)/
仅匹配“Win”,如果后跟“98”,而/Win (?!XP)/
仅匹配“Win”,只有不是后跟“XP” “。 。 。正确?
现在我真的没有得到?:
分隔符。我还没有找到一个很好的例子,我真的非常,真的很困惑。 :/我明白它应该匹配整个包含的模式或什么?
我很困惑的另一件事是反向引用。这是我发现的例子:正则表达式/<(\S+).*>(.*)<\/\1>/
应该匹配“任何标签”。我只是对浏览器的数字“1”感到困惑。 。 。它是第一场比赛 - 在这种情况下,我认为它会引用<
字符 - 或其他什么?
我现在刚刚涉足正则表达的世界,并希望对这些概念做一些澄清,谢谢大家提前!
答案 0 :(得分:5)
您对前瞻断言的看法是正确的。
\1
指的是括号中的第一个子匹配,即您示例中(\S+)
匹配的任何内容。 \2
指的是第二个(在示例中,(.*)
),依此类推。
?:
意味着该组括号不应与\1
之类的引用相关联。如果您需要括号,但是之后并不真正关心获取匹配的文本,则可以使用它。因此,在正则表达式/(?:abc)def(ghi)/
中,\1
不会扩展为abc
(因为我们使用?:
将其关闭),而是ghi
。< / p>
答案 1 :(得分:0)
现在我真的没有得到?:分隔符。我还没有找到一个很好的例子,我真的非常,真的很困惑。 :/我明白它应该匹配整个包含的模式或什么?
?:运算符允许您对正则表达式的各个部分进行分组(就像裸括号一样),不用捕获它们。事实上,它基本上被称为“非捕获组”。
例如:
/^(.*?)(foo|bar)(.*?)$/
结果:第一个捕获组包含匹配前的文本,第二个包含“foo”或“bar”,第三个包含其余部分。
/^(.*?)(?:foo|bar)(.*?)$/
结果:第一个捕获组包含匹配前的文本,第二个包含后面的文本。