冒号是什么意思:在正则表达式中意味着什么?

时间:2016-09-08 20:49:21

标签: php regex preg-match

在某些模式中,我看到使用冒号:。例如:

(?:"[^"]*[^-]?>)|(?:[^\w\s]\s*\/>)|(?:>")

这应匹配:但匹配的内容:

"><script>alert("hello")</script>

其中没有冒号。冒号在这种情况下有特殊意义吗?任何人都能解释一下这个问题吗?

编辑 我认为这些链接解释了有关正则表达式的所有内容。这不是对我的主题的看法。 @ chris85和@sin给出了答案。感谢

1 个答案:

答案 0 :(得分:3)

高级正则表达式需要特殊的构造来传播意义。

到目前为止,最先进的正则表达式构造是简单的打开/关闭分组 (..)并且是分隔符。

它表示作用域的一组构造的开始和结束。

该构造被细分为特殊形式,并添加了某些
添加到开放分隔符(的字符 它告诉引擎该组代表什么 为了便于使用,为了表示复杂构造的开始,问号?跟随开放式窗体,如(?。 以下是一个或多个字符,用于唯一标识该组的功能。

以下是开放分隔的分组构造的(不完整)列表。

(捕获组
(?修饰符组
(?:群组组 (?#评论组
(?|分支重置组
(?'名为捕获组
(?<名为捕获组
(?>原子组

(?=积极前瞻断言组
(?!否定前瞻断言组
(?<=积极的后视断言组 (?<!负面后瞻断言小组

(?&递归组
(?(条件组
(?*回溯控制组

(?{断言代码组
(??{正则表达式注入代码组
(?C标注代码组

所有这些组分隔符必须由要识别的引擎支持。

您可以看到此开放分隔符序列中使用的唯一元字符
(? 它们依次一起使用,它们构成了一个特殊分组构造的开始。

有时,在视觉上你可能会错过这些硬编码的结构 因此,提前了解这些内容符合用户的利益,因此您不必这样做 当你看到像(?::?)这样的东西时会感到困惑。

希望这会有所帮助。

这里只是一个暗示。
他们使用(然后使用?来表示提前进行的事实 分组构造是一个非常聪明的主意。

如果引擎不支持特定的分组构造,则 它会假设?是量词。

但是,当它是一个元字符时,你无法量化一个开放的paren ( 即不是逃避的文字 \(?&lt; - OK量化文字,
(?&lt; - 高级分组构造或BAD(如果不支持)。

结果是,任何以(?开头且不受支持的高级构造 会导致引擎自动抛出错误,例如:
'非元量化元字符''不支持的构造'