我在一个文本中有两种类型的字符串:
A(BC)DE(FG)H
一个(BCD(EF)克)H
我需要在第一级括号之间获取文本。在我的例子中,这是:
BC
FG
BCD(EF)克
我尝试将下一个正则表达式/\((.+)\)/
与Ungreedy(U)标志一起使用:
BC
FG
BCD(EF
没有它:
BC)DE(FG
BCD(EF)克
两种变体都不能满足我的需要。也许有人知道如何解决我的问题?
答案 0 :(得分:1)
这个question几乎有答案,但实现有点含糊不清。您可以在没有~
的情况下使用接受的答案中的逻辑来获得此正则表达式:
\(((?:\[^\(\)\]++|(?R))*)\)
带有此输出的
答案 1 :(得分:1)
使用PCRE Recursive pattern匹配嵌套括号中的子串:
$str = "a(bc)de(fg)h some text a(bcd(ef)g)h ";
preg_match_all("/\((((?>[^()]+)|(?R))*)\)/", $str, $m);
print_r($m[1]);
输出:
Array
(
[0] => bc
[1] => fg
[2] => bcd(ef)g
)
\( ( (?>[^()]+) | (?R) )* \)
首先它匹配一个左括号。然后它匹配任意数量的 子串可以是一系列非括号,也可以是一个 模式本身的递归匹配(即正确的括号 子)。最后,有一个右括号。
技术注意事项:
如果某个模式中有超过 15 捕获括号,则PCRE已 在递归过程中获得额外的内存来存储数据 通过使用pcre_malloc,之后通过pcre_free释放它。如果不 可以获得内存,它为前15次捕获保存数据 仅括号,因为没有办法给出内存不足的错误 从递归中。
答案 2 :(得分:-1)
请你试试看:
preg_match("/\((.+)\)/", $input_line, $output_array);
中测试此代码
Regex: \((.+)\)
Input: a(bcd(eaerga(er)gaergf)g)h
Output: array(2
0 => (bcd(eaerga(er)gaergf)g)
1 => bcd(eaerga(er)gaergf)g
)