在某些模式中,我看到使用冒号:
。例如:
(?:"[^"]*[^-]?>)|(?:[^\w\s]\s*\/>)|(?:>")
这应匹配:
但匹配的内容:
"><script>alert("hello")</script>
其中没有冒号。冒号在这种情况下有特殊意义吗?任何人都能解释一下这个问题吗?
编辑 我认为这些链接解释了有关正则表达式的所有内容。这不是对我的主题的看法。 @ chris85和@sin给出了答案。感谢
答案 0 :(得分:3)
高级正则表达式需要特殊的构造来传播意义。
到目前为止,最先进的正则表达式构造是简单的打开/关闭分组
(..)
并且是分隔符。
它表示作用域的一组构造的开始和结束。
该构造被细分为特殊形式,并添加了某些
添加到开放分隔符(
的字符
它告诉引擎该组代表什么
为了便于使用,为了表示复杂构造的开始,问号?
跟随开放式窗体,如(?
。
以下是一个或多个字符,用于唯一标识该组的功能。
以下是开放分隔的分组构造的(不完整)列表。
(
捕获组
(?
修饰符组
(?:
群组组
(?#
评论组
(?|
分支重置组
(?'
名为捕获组
(?<
名为捕获组
(?>
原子组
(?=
积极前瞻断言组
(?!
否定前瞻断言组
(?<=
积极的后视断言组
(?<!
负面后瞻断言小组
(?&
递归组
(?(
条件组
(?*
回溯控制组
(?{
断言代码组
(??{
正则表达式注入代码组
(?C
标注代码组
所有这些组分隔符必须由要识别的引擎支持。
您可以看到此开放分隔符序列中使用的唯一元字符
是(
和?
它们依次一起使用,它们构成了一个特殊分组构造的开始。
有时,在视觉上你可能会错过这些硬编码的结构
因此,提前了解这些内容符合用户的利益,因此您不必这样做
当你看到像(?::?)
这样的东西时会感到困惑。
希望这会有所帮助。
这里只是一个暗示。
他们使用(
然后使用?
来表示提前进行的事实
分组构造是一个非常聪明的主意。
如果引擎不支持特定的分组构造,则
它会假设?
是量词。
但是,当它是一个元字符时,你无法量化一个开放的paren (
即不是逃避的文字
\(?
&lt; - OK量化文字,
(?
&lt; - 高级分组构造或BAD(如果不支持)。
结果是,任何以(?
开头且不受支持的高级构造
会导致引擎自动抛出错误,例如:
'非元量化元字符'或'不支持的构造'。