Re: [問題] (?(condition)yes-pattern|no-pattern) …

看板Perl作者 (相見不如懷念)時間17年前 (2007/12/17 19:47), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串1/1
這個問題可以先簡化一下,首先先看一下這個原本的 perlre 文件上寫的 m{ ( \( )? [^()]+ (?(1) \) ) }x 這邊的 x 就是忽略正規表示中的注解與空白,所以可以轉換為 /(\()?[^()]+(?(1)\))/ 分成三部份來看: 黃色部份: 用來 match 左括號用,後面用?,表示可不出現或者出現1次 紅色部分: 用來 match 不是左括號或者右括號,而且出現至少一次以上 綠色部分: 子條件正規表示,這邊是我們的重點 (?(condition)yes-pattern) 此處的 condition 寫1表示用來 match \1,也就是黃色部份的內容 如果黃色部份有被 match 到,表示被 match 成功,意即右邊會出現右括號) 這樣寫相信很多人還是搞不太清楚,我們用 sample 來看看 # 有 match 成功 $str = '(test)'; if($str =~ /(\()?[^()]+(?(1)\))/) { print "Match"; } # 沒有 match 成功 $str = '()'; if($str =~ /(\()?[^()]+(?(1)\))/) { print "Match"; } # 透過 condition 來判斷,假設開頭沒有( 但是中間有資料,結尾出現 ],所以 Match # 此時表示落在子條件判斷式的,判斷失敗,跳到後端的\]來看 $str = 'test]'; if($str =~ /(\()?[^()]+(?(1)\)|\])/) { print "Match"; } # 透過 condition 來判斷,假設開頭沒有( 但是中間有資料,結尾沒出現 ],沒 Match $str = 'test='; if($str =~ /(\()?[^()]+(?(1)\)|\])/) { print "Match"; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.71.40

12/17 22:17, , 1F
真感謝版大阿....(淚推...)想了一下午想不通
12/17 22:17, 1F

12/19 15:23, , 2F
該m起來..
12/19 15:23, 2F

12/19 23:19, , 3F
呵呵...這個板好像還沒m過文章就是...
12/19 23:19, 3F
文章代碼(AID): #17Pc7LmE (Perl)
文章代碼(AID): #17Pc7LmE (Perl)