Re: [問題] (?(condition)yes-pattern|no-pattern) …
這個問題可以先簡化一下,首先先看一下這個原本的 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
12/19 15:23, 2F
→
12/19 23:19, , 3F
12/19 23:19, 3F
Perl 近期熱門文章
PTT數位生活區 即時熱門文章