困难的PHP嵌套正则表达式

时间:2018-12-16 15:23:37

标签: php regex nested preg-match-all

给出以下字符串:

lower=Value - 1.96*Std. Error

我需要找到能给出以下结果的正则表达式:

let str = '5+81+3+16+42';
const array = str.split('+');

const splited = []
array.reduce((a, b) => {
  splited.push(a+'+'+b)
  return b
})

console.log(splited);
  

print_r($ result);

{start} SubPattern1 {end} 
....
{start} SubPattern2 {end}
....
{start} {start}SubPattern3{end} {end}

谢谢!

修改

出于视觉目的,我编写了多行字符串。但是,即使所有文本都在单个行字符串中,我也需要该表达式起作用。例如:

  

{start} SubPattern1 {end} {start} SubPattern2 {end} {start} {start} SubPattern3 {end} {end}

2 个答案:

答案 0 :(得分:0)

您可以使用此

^{start}(.*){end}$
  • ^-字符串的开头。
  • {start}-匹配{start}
  • (.*)-匹配除换行以外的所有内容。 (捕获组)。
  • {end}-匹配{end}
  • $-字符串的结尾。

Demo

答案 1 :(得分:0)

您可以匹配{start}和{end}并使用捕获组并对模式使用递归:

{start}((?:(?:(?!{(?:start|end)}).)+|(?R))*){end}

例如:

$string = <<<DATA
{start} SubPattern1 {end} 
{start} SubPattern2 {end}
{start} {start}SubPattern3{end} {end}
DATA;

preg_match_all('/{start}((?:(?:(?!{(?:start|end)}).)+|(?R))*){end}/', $string, $result);
print_r($result);

说明

  • {start}字面上匹配
  • (开始捕获组
    • (?:非捕获组
      • (?:非捕获组
        • (?!{(?:start|end)}).,断言右边的否定超前不是{start}或{end}。在这种情况下,请匹配任何字符。
      • )+|(?R)关闭非捕获组并重复1次以上,或者|重复整个模式
    • )*关闭非捕获组并重复0次以上
  • )关闭捕获组
  • {end}-按字面意思匹配

Regex demo

结果:

Array
(
    [0] => Array
        (
            [0] => {start} SubPattern1 {end}
            [1] => {start} SubPattern2 {end}
            [2] => {start} {start}SubPattern3{end} {end}
        )

    [1] => Array
        (
            [0] =>  SubPattern1 
            [1] =>  SubPattern2 
            [2] =>  {start}SubPattern3{end} 
        )

)

Php demo