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