我将尝试在PHP中解析以下格式的字符串(EBNF,希望我理解正确):
我试图编写一个正则表达式模式,总是会给我四个组:
1. 最左边的。从上面的示例中,这将是: - token1 - token1 - token1 - token1&token2 - token1&token2|(token3&!token4)
2. 如果["!"]存在,则为
3. 下一个的(如果有)。这将是: -
<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
我试图编写一个正则表达式模式,总是会给我四个组:
1. 最左边的。从上面的示例中,这将是: - token1 - token1 - token1 - token1&token2 - token1&token2|(token3&!token4)
2. 如果["!"]存在,则为
null
或!
。3. 下一个的(如果有)。这将是: -
null
- &
- |
- |
- |
4. 模式的其余部分。
- null
- token2
- token2&!token3
- token3&(token4|(!token5,12&token6))
- token5,12
只要第一个表达式不包含任何,就可以解析它。^\(?(!?)([a-zA-Z0-9\-]+)\)?([&|]?)(.*)$
我卡在这个点了。我尝试使用环视,但是我无法弄清楚如何确保当所有括号都平衡时,组被捕获。这是否可以通过正则表达式实现,还是需要编写使用循环等的代码来完成?
?(DEFINE)
块。但是,PCRE只允许匹配,而不是解析。你无法获得所需的拆分结果列表。(除非你还使用递归的preg_replace_callback
来收集所有令牌。) - mario