1
geelaw 2017-05-19 16:30:01 +08:00 via iPhone 1
定义一下“括号外”
比如 A[B[C]D]E]F[G]H |
3
whahuzhihao 2017-05-19 17:01:42 +08:00 1
需要找一个零宽度的位置来替换,这个位置满足:
1. 右侧必须是非括号 2. 右侧之后不能有右括号 用 PHP 实现如下 echo preg_replace('/(?=[^\[\]])(?![^\[\]]*\])/','-','AA[BCD]EEE[FF]GH '); |
4
whahuzhihao 2017-05-19 17:02:54 +08:00 2
|
5
sunhk25 OP @whahuzhihao 正好匹配 谢谢
|
6
airycanon 2017-05-19 17:35:59 +08:00
@whahuzhihao 原来零宽度可以这样用,学习了。
|
7
geelaw 2017-05-19 17:44:02 +08:00 1
一个更简单的方法:
(.(\[.*?\])+|.) 替换为 -$1 因为优先匹配竖线左边的情况,所以会把形如 x[y...z]...[a...b] 的拿出来变成 -x[y...z]...[a...b]。 但如果一个字符 x 后面紧接着不是 [,那么只能匹配到 x 本身,拿出来变成 -x。 又因为查找不重叠,所以当括号深度不超过 1 且正确配对的时候这个表达式实现正确功能,且该过程是线性的。 用前面提到的零宽度查询法通常的实现会是平方速度的,考虑 [x...x],括号里面每个位置是否匹配需要线性时间,通常的引擎无法利用“后面有 ]”的知识更快解决问题。 |