簡體   English   中英

帶有模式的遞歸PCRE搜索

[英]Recursive PCRE search with patterns

這個問題與PCRE有關。

我看到了遞歸搜索此結構使用的嵌套括號:

\(((?>[^()]+)|(?R))*\)

問題是,雖然[[^()] + '可以匹配包括換行符在內的任何字符,但是您只能匹配單個字符,例如大括號,方括號,標點符號,單個字母等。

我正在嘗試用任何一種模式(例如,諸如“ BEGIN”和“ END”之類的關鍵字)替換“(”和“)”字符。

我想出了以下結構:

(?xs)  (?# <-- 'xs' ignore whitespace in the search term, and allows '.'
               to match newline )
(?P<pattern1>BEGIN)
(
   (?> (?# <-- "once only" search )
      (
         (?! (?P=pattern1) | (?P<pattern2>END)).
      )+
   )
   | (?R)
)*
END

實際上,這將適用於如下所示的內容:

BEGIN <<date>>
  <<something>
    BEGIN
      <<something>>
    END <<comment>>
    BEGIN <<time>>
      <<more somethings>>
      BEGIN(cause we can)END
      BEGINEND
    END
  <<something else>>
END

這可以成功匹配任何嵌套的BEGIN..END對。

我分別為BEGINEND設置了命名模式pattern1pattern2 在搜索詞中使用pattern1可以正常工作。 但是,我不能在搜索結束時使用pattern2 :我必須寫出' END '。

知道如何重寫該正則表達式,這樣我只需一次指定模式並在代碼中“無處不在”使用它們即可嗎? 換句話說,因此我不必在搜索的中間和結尾都寫END

要進一步擴展@Kobis答案,請參見以下正則表達式:

(?xs)
(?(DEFINE)
        (?<pattern1>BEGIN)
        (?<pattern2>END)
)
(?=((?&pattern1)
(?:
   (?> (?# <-- "once only" search )
      (?:
         (?! (?&pattern1) | (?&pattern2)) .
      )+
   )*
   | (?3)
)*
(?&pattern2)
))

這個正則表達式將允許您甚至為每個單獨的數據塊獲取數據! 使用第三個后向引用,因為前兩個已在define塊中定義。

演示: http//regex101.com/r/bX8mB6

對於(?(DEFINE))塊,這似乎是一個好用例,該塊用於創建此類構造。 一個Perl的例子是:

(?xs)
(?(DEFINE)
        (?<pattern1>BEGIN)
        (?<pattern2>END)
)
(?&pattern1)
(
   (?> (?# <-- "once only" search )
      (
         (?! (?&pattern1) | (?&pattern2)).
      )+
   )
   | (?R)
)*
(?&pattern2)

范例: http//ideone.com/8o9cg

(請注意,我真的不了解任何perl,也無法在任何在線測試儀的PHP上使用它)

另請參閱: http : //www.pcre.org/pcre.txt (查找(?(DEFINE) 0,看起來好像沒有頁面)


適用於大多數口味的低技術解決方案是在模式開始時先行使用:

(?=.*?(?P<pattern1>BEGIN))
(?=.*?(?P<pattern2>END))
...
(?P=pattern1) (?# should work - it was captured )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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