如果紅寶石可以支持\G
錨,這是一個解決方案。
看起來很討厭,但有幾件事情正在發生。
1.它僅允許一個單一的巢(外加上許多內部件)
2.將不匹配不與'(prop\d true|false)'
遵守沒有條件2無效的形式,這將是容易得多,其是指示那兩個正則表達式解決方案也會這樣做。首先捕獲外部表格sat((..)..(..)..)
秒以全局捕捉內部表格(prop\d true|false)
。
可以在一個正則表達式中完成,雖然這將很難看,但應該工作(在Perl中測試用例如下)。
# (?:(?!\A|sat\s*\()\G|sat\s*\()[^()]*(?:\((?!prop\d[ ](?:true|false)\))[^()]*\)[^()]*)*\((prop\d[ ](?:true|false))\)(?=(?:[^()]*\([^()]*\))*[^()]*\))
(?:
(?! \A | sat \s* \()
\G # Start match from end of last match
| # or,
sat \s* \( # Start form 'sat ('
)
[^()]* # This check section consumes invalid inner '(..)' forms
(?: # since we are looking specifically for '(prop\d true|false)'
\(
(?!
prop \d [ ]
(?: true | false)
\)
)
[^()]*
\)
[^()]*
)* # End section, do optionally many times
\(
( # (1 start), match inner form '(prop\d true|false)'
prop \d [ ]
(?: true | false)
) # (1 end)
\)
(?= # Look ahead for end form '(..)(..))'
(?:
[^()]*
\([^()]* \)
)*
[^()]*
\)
)
Perl的測試用例
$/ = undef;
$str = <DATA>;
while ($str =~ /(?:(?!\A|sat\s*\()\G|sat\s*\()[^()]*(?:\((?!prop\d[ ](?:true|false)\))[^()]*\)[^()]*)*\((prop\d[ ](?:true|false))\)(?=(?:[^()]*\([^()]*\))*[^()]*\))/g)
{
print "'$1'\n";
}
__DATA__
((prop10 true))
sat
((prop3 false)
(asdg)
(propa false)
(prop1 false)
(prop2 true)
)
((prop5 true))
輸出>>
'prop3 false'
'prop1 false'
'prop2 true'
來源
2014-02-26 21:58:42
sln
應用正則表達式將會使您的生活更輕鬆之前拆分您輸入的字符串。 – beerbajay
嵌套怎麼樣?什麼語言?它支持'\ G'錨嗎?它支持遞歸嗎? – sln
我想要一個不涉及拆分字符串的版本。我真的正在尋找一個可以滿足好奇心的正則表達式。我可以絕對分開坐在,然後只是正則表達式後,但我會學習更少:) –