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
私は常に4つのグループを与える正規表現パターンを書き込もうとしています。
- 左端
<expression>
。上記の例から、これは次のようになります。token1
token1
token1
token1&token2
token1&token2|(token3&!token4)
- 存在した場合
["!"]
。つまりnull
null
null
null
!
<modifier>
次の(<expression>
もしあれば)。これは:null
&
|
|
|
- パターンの残り。
null
token2
token2&!token3
token3&(token4|(!token5,12&token6))
token5,12
最初の式にsが含まれていない場合は、これを解析できます<modifier>
。
^\(?(!?)([a-zA-Z0-9\-]+)\)?([&|]?)(.*)$
私はこの時点で立ち往生しています。ルックアラウンドを使用してみましたが、すべてのブラケットのバランスが取れているときにグループが確実にキャプチャされるようにする方法がわかりません。これはRegExで実現できますか、それともループなどを使用してコードを記述してこれを行う必要がありますか?