gpt4 book ai didi

php - "[^][]"正则表达式是什么意思?

转载 作者:IT王子 更新时间:2023-10-29 00:54:53 28 4
gpt4 key购买 nike

我在以下正则表达式中找到了它:

\[(?:[^][]|(?R))*\]

它匹配方括号(及其内容)以及嵌套的方括号。

最佳答案

[^][] 是一个字符类,表示除[] 之外的所有字符。

您可以避免转义 [] 特殊字符,因为它对于 PCRE 没有歧义,PCRE 是 preg_ 函数中使用的正则表达式引擎。

由于 [^] 在 PCRE 中不正确,正则表达式解析的唯一方法是 ] 在稍后将关闭的字符类中。与后面的 [ 相同。它不能在字符类中重新打开字符类(POSIX 字符类[:alnum:] 除外)。那么最后的]就清楚了;这是字符类的结束。但是,字符类之外的 [ 必须被转义,因为它被解析为字符类的开头。

同理,你可以写[]][[][^[]而不转义 [] 在字符类中。

注意:从 PHP 7.3 开始,您可以使用 inline xx 修饰符,即使在字符类中也可以忽略空白字符。这样你就可以用一种不那么模棱两可的方式来编写这些类:(?xx) [^ ][ ] [ ] ] [ [ ] [^ [ ]

您可以将此语法与多种正则表达式一起使用:PCRE (PHP, R), Perl, Python, Java, .NET, GO, awk, Tcl (如果您用大括号分隔您的模式,感谢 Donal Fellows ), ...

但不适用于:Ruby、JavaScript(除了 IE < 9)、...

正如 m.buettner 所说,[^]] 没有歧义,因为 ]first 字符,[^a ]] 被视为 所有不是 a 后跟 ] 的内容。要拥有 a],您必须编写:[^a\]][^]a]

在 JavaScript 的特定情况下,规范允许 [] 作为 从不 匹配的正则表达式标记(换句话说,[] 将总是失败)和 [^] 作为匹配 任何字符的正则表达式。然后 [^]] 被视为 任何字符后跟 ]。实际实现各不相同,但现代浏览器通常会遵循规范中的定义。

模式详情:

\[          # literal [
(?: # open a non capturing group
[^][] # a character that is not a ] or a [
| # OR
(?R) # the whole pattern (here is the recursion)
)* # repeat zero or more time
\] # a literal ]

在您的模式示例中,您不需要转义最后一个 ]

但是你可以对这个模式做同样的事情,稍微优化一下,更有用的原因是可以作为子模式重用 (使用 (?-1)):(\[(?:[^][]+|(?-1))*+])

(                     # open the capturing group
\[ # a literal [
(?: # open a non-capturing group
[^][]+ # all characters but ] or [ one or more time
| # OR
(?-1) # the last opened capturing group (recursion)
# (the capture group where you are)
)*+ # repeat the group zero or more time (possessive)
] # literal ] (no need to escape)
) # close the capturing group

或更好:(\[[^][]*(?:(?-1)[^][]*)*+]) 避免了替换成本。

关于php - "[^][]"正则表达式是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845014/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com