[英](PHP) Parsing RegEx string - balancing brackets
我正在嘗試在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模式,該模式將始終為我提供四組:
<expression>
。 從上面的示例可以看出:
token1
token1
token1
token1&token2
token1&token2|(token3&!token4)
["!"]
。 即
null
null
null
null
!
<expression>
的<modifier>
(如果有)。 這將是:
null
&
|
|
|
null
token2
token2&!token3
token3&(token4|(!token5,12&token6))
token5,12
只要第一個表達式不包含任何<modifier>
,我就可以解析它。
^\(?(!?)([a-zA-Z0-9\-]+)\)?([&|]?)(.*)$
我被困在這一點上。 我嘗試使用環視,但是當所有方括號平衡時,我無法弄清楚如何確保該組被捕獲。 使用RegEx可以做到這一點,還是我需要使用循環等編寫代碼來做到這一點?
據我所知,這是不可能的。
您有上下文無關的語法(EBNF用於此類語法-類型2語法),無法使用正則表達式(對於常規語法-類型3語法)進行解析。
http://en.wikipedia.org/wiki/Chomsky_hierarchy
作為您不能在此處處理的事情的一個示例:開括號的數量-您只能為每個括號編寫一個正則表達式(但是可以是無限的,對吧?),否則無法確定匹配的數量結束括號是相同的。 沒有辦法用數量詞( +
, *
等)來計算正則表達式的特定部分算出的字符數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.