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

看板RegExp (正規表示式 Regular Expression)作者 (Cindy Wang)時間14年前 (2011/02/10 12:07), 編輯推噓3(301)
留言4則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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 了.. ^^| -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.242.246.249

02/10 21:29, , 1F
我是用vb的RegExp,似乎也沒有類似的用法,非常感謝解答
02/10 21:29, 1F

02/17 22:29, , 2F
php 的 preg 也可以
02/17 22:29, 2F

02/17 22:56, , 3F
另外 Ruby 有另一種解法,但是其實括號批配的演算法
02/17 22:56, 3F

02/17 22:56, , 4F
並不難就是了
02/17 22:56, 4F
※ 編輯: CindyLinz 來自: 210.242.246.249 (09/10 13:16)
文章代碼(AID): #1DKsIT1R (RegExp)
文章代碼(AID): #1DKsIT1R (RegExp)