我正在尝试在 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>
. 从上面的例子来看,这将是:token1
token1
token1
token1&token2
token1&token2|(token3&!token4)
- 如果
["!"]
在场。IEnull
null
null
null
!
- 下
<modifier>
一个<expression>
(如果有的话)。这将是:null
&
|
|
|
- 剩下的图案。
null
token2
token2&!token3
token3&(token4|(!token5,12&token6))
token5,12
如果第一个表达式不包含任何<modifier>
s,我可以解析它。
^\(?(!?)([a-zA-Z0-9\-]+)\)?([&|]?)(.*)$
我被困在这一点上。我尝试过使用环视,但是我不知道如何确保在所有括号都平衡时捕获该组。这是否可以通过 RegEx 实现,或者我是否需要使用循环等编写代码来做到这一点?