PHP 正则表达式环顾四周,匹配多次出现

PHP regex look around with matching multiple occurrences

我有这样的文字:

const {
    b {
        description "Create B1"
        uri "ms:///a/v1/create-b"
    }
    c {
        description "Create C1"
        uri "ms:///a/v1/create-c"
    }
    d {
        description "Create D1"
        uri "ms:///a/v1/create-d"
    }
}

const {
    b {
        description "Create B2"
        uri "ms:///a/v1/create-b"
    }
    c {
        description "Create C2"
        uri "ms:///a/v1/create-c"
    }
    d {
        description "Create D2"
        uri "ms:///a/v1/create-d"
    }
}

我正在尝试获取 const 之间的所有内容,这是我目前得出的结果:const {(?s)(.*)}.*?(?=const)。这只是第一次出现,我无法弄清楚如何获得所有其他的(在原始文件中有更多 const 个对象)。

任何朝着正确方向的推动都会受到欢迎

link 您可以在这里进行测试:https://regex101.com/r/I4W5cR/1

您可以利用每个匹配项在行首以 const 开头的事实:

(?sm)^const {(.*?)}\s*\R(?=const|\Z)

regex demo

详情

  • (?sm) - s 启用 DOTALL 模式,m 使 ^ 匹配行起始位置
  • ^ - 行首
  • const { - 一个子串
  • (.*?) - 第 1 组:任意零个或多个字符,尽可能少
  • } - 一个 } 字符
  • \s*\R - 零个或多个空格,然后是换行符
  • (?=const|\Z) - 紧靠右边,必须有 const 或字符串结尾。