首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配多维字符串中的顶级分隔符的正则表达式

匹配多维字符串中的顶级分隔符的正则表达式
EN

Stack Overflow用户
提问于 2012-07-13 17:26:43
回答 2查看 687关注 0票数 0

我有一个采用大型多维结构的文件,类似于json,但还不够接近,无法使用json库。

数据看起来像这样:

代码语言:javascript
复制
alpha {
    beta {
        charlie;
    }
    delta;
}

echo;
foxtrot {
    golf;
    hotel;
}

我尝试构建的正则表达式(对于preg_match_all)应该与每个顶级父元素(由{}大括号分隔)匹配,这样我就可以递归匹配,构建一个表示数据的多维php数组。

我尝试的第一个正则表达式是/(?<=\{).*(?=\})/s,它贪婪地匹配大括号内的内容,但是这并不是很正确,因为当顶级中有多个兄弟时,匹配太贪婪了。示例如下:

使用正则表达式/(?<=\{).*(?=\})/s匹配如下所示:

匹配1:

代码语言:javascript
复制
    beta {
        charlie;
    }
    delta;
}

echo;
foxtrot {
    golf;
    hotel;

相反,结果应该是: Match 1:

代码语言:javascript
复制
    beta {
        charlie;
    }
    delta;

比赛2:

代码语言:javascript
复制
    golf;
    hotel;

那么正则表达式向导,我在这里遗漏了什么函数,或者我需要用php来解决这个问题?非常欢迎任何提示:)

EN

回答 2

Stack Overflow用户

发布于 2012-07-13 18:12:47

当然,你可以用正则表达式做到这一点。

代码语言:javascript
复制
preg_match_all(
    '/([^\s]+)\s*{((?:[^{}]*|(?R))*)}/',
    $yourStuff,
    $matches,
    PREG_SET_ORDER
);

这为我在匹配中提供了以下内容:

代码语言:javascript
复制
[1]=>
string(5) "alpha"
[2]=>
string(46) "
beta {
    charlie;
}
delta;
"

代码语言:javascript
复制
[1]=>
string(7) "foxtrot"
[2]=>
string(22) "
golf;
hotel;
"

把它拆分一下。

代码语言:javascript
复制
([^\s]+)                # non-whitespace (block name)
\s*                     # whitespace (between name and block)
{                       # literal brace
    (                   # begin capture
        (?:             # don't create another capture set
            [^{}]*      # everything not a brace
            |(?R)       # OR recurse
        )*              # none or more times
    )                   # end capture
}                       # literal brace

仅供参考,这在n层大括号上工作得很好。

票数 2
EN

Stack Overflow用户

发布于 2012-07-13 17:43:00

我认为你可以通过匹配[a-zA-Z0-9][:blank]+{}来使用preg_split得到一些东西。您将能够通过遍历结果来构造数组。使用一个递归函数,当你匹配一个开始标签时,它会更深入一些,而在一个结束标签上,它会更高一些。

否则,最干净的解决方案就是实现ANTLR语法!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11467705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档