Re: [問題] 怎麼找第一個匹配的外括號內容

作者: CindyLinz (Cindy Wang)   2011-02-10 12:07:55
※ 引述《unlearn (我沒你那麼堅強..)》之銘言:
: 層數不固定的巢狀括號是否有辦法找到外層匹配的括號?
: 舉例:原字串為 "(a b c(d e f)(g))(h i)"
: pattern 要怎麼寫才會同時 match 到(a b c(d e f)(g)) , (h i)
: abc..j 表示一般文字字串
: 想法:
: 原字串最多一層時,如: (h i) -> 可用 \([^()]*\)
: 原字串最多二層時,如: (a b c(d e f)(g)) -> 可用 \([^()]*(\([^()]*\))*[^()]*\)
: 但是如果今天原始字串不確定最多有幾層(深)的括號
: patern要怎麼寫才能判斷正確?
如果是 perl 5.10 的 regex 可以用:
/\(([^()]|\((?1)*\))*\)/
中間的 (?1) 會去拿第一組 capture 去 match.
這一段程式
$a = "(a b c(d e f)(g))(h i)(((123)))";
print $&,$/ while( $a =~ /\(([^()]|\((?1)*\))*\)/g );
會印出
(a b c(d e f)(g))
(h i)
(((123)))
不過根據原始數學上定義的 regex, 不能找這種不定深度的匹配..
perl 的 regex 已經不是 regex 了.. ^^|
作者: unlearn (我沒你那麼堅強..)   2011-02-10 21:29:00
我是用vb的RegExp,似乎也沒有類似的用法,非常感謝解答
作者: godspeedlee (妳,我可以)   2011-02-17 22:29:00
php 的 preg 也可以另外 Ruby 有另一種解法,但是其實括號批配的演算法並不難就是了

Links booklink

Contact Us: admin [ a t ] ucptt.com