簡體   English   中英

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

[英](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模式,該模式將始終為我提供四組:

  1. 最左邊的<expression> 從上面的示例可以看出:
    • token1
    • token1
    • token1
    • token1&token2
    • token1&token2|(token3&!token4)
  2. 如果存在["!"]
    • null
    • null
    • null
    • null
    • !
  3. 下一個<expression><modifier> (如果有)。 這將是:
    • null
    • &
    • |
    • |
    • |
  4. 剩下的圖案。
    • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM