【问题标题】:Matching all contents between curly braces - Regex匹配大括号之间的所有内容 - 正则表达式
【发布时间】:2018-12-02 04:47:15
【问题描述】:

我想在 {}, 之间进行解析。我搜索并已经尝试了 stackoverflow 的许多解决方案,但似乎并非所有解决方案都有效。

对我来说最好的解决方案是Extracting all values between curly braces regex php,但是当有嵌套的花括号时它会失败。我试过{\K[^}]*(?=},) 例如:Id: 1181 不匹配。

样本数据

{
    Id: 1180
    Name: "ABCD"
    Type: 1
    Json: <"
        Some sample data
    ">
},
{
    Id: 1181
    Name: "EFGH"
    Type: 4
    More: Value
    More: Value
    Json: <"
        Some sample data "{ with more curly braces }" and "{ more curly braces }";
    ">
},
{
    Id: 1182
    Name: "IJKL"
    Type: 2
    Json: <"
        Some sample data
    ">
},

崇高的结果

【问题讨论】:

  • 这种奇怪的格式从何而来?
  • @CasimiretHippolyte 好吧,一家公司向我提供了该数据并希望我将其存储在数据库中。
  • @anubhava 工作正常。谢谢

标签: php regex preg-match-all


【解决方案1】:

你可以使用这个recursive regex in PHP

$regex = '/ { ( (?: [^{}]* | (?R) )* ) } /x';

RegEx Demo

【讨论】:

  • 解释一下就好了。
  • 我已经在递归正则表达式上链接了官方 PHP 页面。
  • 这是一个非常漂亮的正则表达式!
  • 我在 NodeJS 中收到错误“无效组”。知道为什么吗?
  • NodeJS 不支持 PCRE,因此不能使用递归正则表达式。
【解决方案2】:

没有这种格式的规范,就没有解析输入的干净解决方案。使用正则表达式只能部分帮助您,因为“Json”字段内可能有任何实用的东西。

如果您需要一个快速而肮脏的解决方案,您可以使用以下事实,即卷曲位于行首。

$m = preg_split('~^},$~m', $data);

preg_match_all('/\{.*?^\},$/ms', $str, $matches, PREG_SET_ORDER);

从那时起,您可以随心所欲地处理数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2011-09-06
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多