作者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
1F:推 abliou:真感谢版大阿....(泪推...)想了一下午想不通 12/17 22:17
2F:→ airkiss:该m起来.. 12/19 15:23
3F:→ LiloHuang:呵呵...这个板好像还没m过文章就是... 12/19 23:19