精華區beta Perl 關於我們 聯絡資訊
這個問題可以先簡化一下,首先先看一下這個原本的 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
abliou:真感謝版大阿....(淚推...)想了一下午想不通 12/17 22:17
airkiss:該m起來.. 12/19 15:23
LiloHuang:呵呵...這個板好像還沒m過文章就是... 12/19 23:19