TL; DR:有沒有辦法指定一個條件,以便開始元素必須匹配其配對關閉元素?條件可以用來配對平衡組元素嗎?
示例位於on regex101.com。
=====
在正則表達式平衡元件通常是通過遞歸處理。這意味着可以找到嵌套的{...{...{...}...}...}
。
此外,PCRE允許(?(DEFINE)...)
結構,它允許您定義各種模式而不實際開始匹配。
在常規表達式
# Define the opening and closing elements before the recursion occurs
(?(DEFINE)
(?<open_curly>\{)
(?<close_curly>\})
# ... other definitions here ...
(?<open>\g'open_curly')
(?<close>\g'close_curly')
)
# Match the opening element
(\g'open'
(?>
# For recursion, don't match either the opening or closing element
(?!\g'open'|\g'close')(?s:.)
|
# Recurse this captured pattern
(?-1)
)*
# Match the closing element
\g'close')
的元素是{
和}
字符,並且可以匹配針對圖案,例如
{{{}}}
{ test1 { test2 { test3 { test4 } } } }
我想包括其他開/關元件,諸如[
和]
或--[
和--]
,因此包括在(?(DEFINE))
中的那些:
(?<open_square>\[)
(?<close_square>\])
(?P<open_pascal>(?i:\bbegin\b))
(?P<close_pascal>(?i:\bend\b))
(?P<open_lua>--\[)
(?P<close_lua>--\])
(?<open>\g'open_curly'|\g'open_square'|\g'open_pascal'|\g'open_lua')
(?<close>\g'close_curly'|\g'close_square'|\g'close_pascal'|\g'close_lua')
什麼這並不正確地做的是與它的閉合元件對的開口元件,允許向--[
組}
,這是不期望的。
有沒有辦法在這樣的正則表達式中創建開放/關閉對?
在一般的情況下,正則表達式的不能檢測平衡元件,事業正則表達式是一個狀態機,但你需要一個堆棧機。 –
@Mark模式匹配庫允許您使用遞歸(需要堆棧)來允許匹配的嵌套結構。看到我的答案。一些實現(.NET)使用平衡組,這也是一個堆棧。所以你肯定可以將嵌套結構與這些模式相匹配 - 只有你不能再稱它們爲* regular *。 –
謝謝。這是我的一個新信息。 –