PHP中的RegExp。在第一级括号之间获取文本

时间:2017-04-08 13:10:36

标签: php regex parentheses non-greedy

我在一个文本中有两种类型的字符串:

  

A(BC)DE(FG)H

     

一个(BCD(EF)克)H

我需要在第一级括号之间获取文本。在我的例子中,这是:

  

BC

     

FG

     

BCD(EF)克

我尝试将下一个正则表达式/\((.+)\)/与Ungreedy(U)标志一起使用:

  

BC

     

FG

     

BCD(EF

没有它:

  

BC)DE(FG

     

BCD(EF)克

两种变体都不能满足我的需要。也许有人知道如何解决我的问题?

3 个答案:

答案 0 :(得分:1)

这个question几乎有答案,但实现有点含糊不清。您可以在没有~的情况下使用接受的答案中的逻辑来获得此正则表达式:

\(((?:\[^\(\)\]++|(?R))*)\)
带有此输出的

Tested

enter image description here

答案 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);

http://www.phpliveregex.com/

中测试此代码
Regex: \((.+)\)
Input: a(bcd(eaerga(er)gaergf)g)h
Output: array(2
   0    =>  (bcd(eaerga(er)gaergf)g)
   1    =>  bcd(eaerga(er)gaergf)g
)