[英]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對。
我分別為BEGIN和END設置了命名模式pattern1和pattern2 。 在搜索詞中使用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.