8

我正在尝试在 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 模式,它总是会给我四个组:

  1. 最左边的<expression>. 从上面的例子来看,这将是:
    • token1
    • token1
    • token1
    • token1&token2
    • token1&token2|(token3&!token4)
  2. 如果["!"]在场。IE
    • 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\-]+)\)?([&|]?)(.*)$

我被困在这一点上。我尝试过使用环视,但是我不知道如何确保在所有括号都平衡时捕获该组。这是否可以通过 RegEx 实现,或者我是否需要使用循环等编写代码来做到这一点?

4

1 回答 1

1

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

您有一个上下文无关的语法(EBNF 适用于这种类型的语法 - Type-2 语法),它不能用正则表达式解析(用于正则语法 - Type-3 语法)。

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

举个你不能在这里处理的例子:开括号的数量——你只能为每个数量写一个正则表达式(但可以是无限的,对吗?),否则无法判断匹配的数量结束括号是相同的。没有办法计算正则表达式的特定部分用量词( , 等)计算出的+字符*

于 2012-07-07T20:54:21.797 回答