我正在尝试在 PHP 中解析以下格式的字符串(EBNF,我希望这是正确的):
<exp> ::= <base>[{<modifier>["!"]"("<exp>")"}]
<base> ::= <role>[{<modifier><role>}]
<modifier> ::= "&" | "|"
<role> ::= ["!"]<str>[","<str>]
<str>可以通过的字符串在哪里[a-zA-Z0-9\-]+
以下是必须解析的模式示例:
token1
token1&token2
token1|(token2&!token3)
(token1&token2)|(token3&(token4|(!token5,12&token6)))
!(token1&token2|(token3&!token4))|token5,12
我正在尝试编写一个 RegEx 模式,它总是会给我四个组:
- 最左边的
<expression>. 从上面的例子来看,这将是:token1token1token1token1&token2token1&token2|(token3&!token4)
- 如果
["!"]在场。IEnullnullnullnull!
- 下
<modifier>一个<expression>(如果有的话)。这将是:null&|||
- 剩下的图案。
nulltoken2token2&!token3token3&(token4|(!token5,12&token6))token5,12
如果第一个表达式不包含任何<modifier>s,我可以解析它。
^\(?(!?)([a-zA-Z0-9\-]+)\)?([&|]?)(.*)$
我被困在这一点上。我尝试过使用环视,但是我不知道如何确保在所有括号都平衡时捕获该组。这是否可以通过 RegEx 实现,或者我是否需要使用循环等编写代码来做到这一点?