作者LiloHuang (相見不如懷念)
看板Perl
標題Re: [問題] (?(condition)yes-pattern|no-pattern) …
時間Mon Dec 17 19:47:32 2007
這個問題可以先簡化一下,首先先看一下這個原本的 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