我发现它在以下正则表达式中:
\[(?:[^][]|(?R))*\]
Run Code Online (Sandbox Code Playgroud)
它将方括号(及其内容)与嵌套方括号相匹配.
Cas*_*yte 68
[^][]是一个字符类,表示除[和之外的所有字符].
您可以避免转义[和]特殊字符,因为PCRE(preg_函数中使用的正则表达式引擎)不明确.
由于[^]在PCRE中不正确,正则表达式解析的唯一方法]是在字符类中,稍后将关闭.与此相同[.它无法在字符类中重新打开字符类(POSIX字符类除外[:alnum:]).然后最后一个]是明确的; 它是角色类的结尾.但是,[必须转义字符类外部,因为它被解析为字符类的开头.
以同样的方式,你可以写[]]或者[[]或[^[]不逃离[或]在字符类.
您可以将此语法与几种正则表达式一起使用:PCRE(PHP,R),Perl,Python,Java,.NET,GO,awk,Tcl(如果用大括号分隔您的模式,感谢Donal Fellows),...
但不是:Ruby,JavaScript(除了IE <9),......
正如m.buettner所指出的那样,[^]]并不含糊,因为它]是第一个字符,[^a]]被视为所有不是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 ]
Run Code Online (Sandbox Code Playgroud)
在您的模式示例中,您不需要转义最后一个 ]
但是你可以对这个模式做一点点优化,更有用的原因可以重用为子模式(带有(?-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
Run Code Online (Sandbox Code Playgroud)
或更好:(\[[^][]*(?:(?-1)[^][]*)*+])这可以避免交替的成本.
| 归档时间: |
|
| 查看次数: |
2123 次 |
| 最近记录: |