PHP正则表达式中的环视和匹配多个出现次数

3

我有这样的文本:

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对象)。
如果你有任何指导,请提供帮助。
你可以在此链接中测试这个正则表达式:https://regex101.com/r/I4W5cR/1

你使用的是哪种编程语言?如果你使用Python的re.findall或者PHP的preg_match_all(),它应该会返回所有出现的结果。 - Barmar
1个回答

1
你可以利用每个匹配项都以行首的 const 开始这一事实:
(?sm)^const {(.*?)}\s*\R(?=const|\Z)

请查看正则表达式演示

细节

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接