(PHP)解析RegEx字符串 - 平衡括号

Bar*_*tak 8 php regex

我试图在PHP中解析以下格式的字符串(EBNF,我希望这是对的):

<exp>      ::= <base>[{<modifier>["!"]"("<exp>")"}]
<base>     ::= <role>[{<modifier><role>}]
<modifier> ::= "&" | "|"
<role>     ::= ["!"]<str>[","<str>]
Run Code Online (Sandbox Code Playgroud)

哪个<str>字符串会通过哪里[a-zA-Z0-9\-]+

以下是必须解析的模式示例:

token1
token1&token2
token1|(token2&!token3)
(token1&token2)|(token3&(token4|(!token5,12&token6)))
!(token1&token2|(token3&!token4))|token5,12
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个总是给我四组的RegEx模式:

  1. 最左边的<expression>.从上面的例子可以看出:
    • token1
    • token1
    • token1
    • token1&token2
    • token1&token2|(token3&!token4)
  2. 如果["!"]有的话.即
    • null
    • null
    • null
    • null
    • !
  3. <modifier>下一个<expression>(如果有的话).这将是:
    • null
    • &
    • |
    • |
    • |
  4. 剩下的模式.
    • null
    • token2
    • token2&!token3
    • token3&(token4|(!token5,12&token6))
    • token5,12

如果第一个表达式不包含任何<modifier>s ,我可以解析它.

^\(?(!?)([a-zA-Z0-9\-]+)\)?([&|]?)(.*)$
Run Code Online (Sandbox Code Playgroud)

我被困在这一点上.我已经尝试过使用lookarounds,但是我无法弄清楚如何在所有括号均衡时确保捕获该组.这可以通过RegEx实现,还是需要使用循环等编写代码来执行此操作?

scr*_*tin 1

据我所知,这是不可能的。

您有一个上下文无关语法(EBNF 适用于此类语法 - Type-2 语法),它无法用正则表达式(适用于正则语法 - Type-3 语法)进行解析。

http://en.wikipedia.org/wiki/Chomsky_hierarchy

作为你不能在这里处理的事情的一个例子:左括号的数量 - 你只能为其中的每个数字编写一个正则表达式(但可以是无限的,对吧?),否则无法判断匹配的数量右括号是相同的。无法计算正则表达式的特定部分与量词( 、 等)计算出的+字符*

  • 不正确。仅仅因为它们被称为正则表达式,[并不意味着](http://stackoverflow.com/questions/2255403/why-is-recursive-regex-not-regex)它们仅限于常规语言。仅供参考,您还可以递归调用特定子表达式“(?1)”,从而排除“^”和“$”。 (4认同)