一行程序正则匹配问题



QUOTE:
原帖由 churchmice 于 2008-8-21 18:20 发表
方法也是有的

perl -ne 'print $2 ."\n" if m#domain(?:-bak)?/(db\.)?(.+)(?(1)|(?=(\.db(?=\.bak)?)))#' 1.txt

churchmice 的正则真是炉火纯青啊,可否解释解释后面一段?
好牛

perldoc perlre
extended patterns


QUOTE:
原帖由 __lxmxn__ 于 2008-8-21 20:18 发表

churchmice 的正则真是炉火纯青啊,可否解释解释后面一段?

(?(1)|(?=(\.db(?=\.bak)?)))#' 1.txt


?(1) if 前面成功匹配了 db.的,就不再继续匹配,

|   else

(?=(\.db   匹配 .db

(?=\.bak)?  匹配可能出现的 .bak

清楚了吧


谢谢楼上的几位高人,我得回家再通读《精通正则表达式》了!
那就不写$
直接看大骆驼的正则, 那效果更明显
其实没必要用这么复杂的 re,你先匹配再替换不成么?

$_ = $1 if m{/(.*)};
s/\.bak$//;
s/\.db$//;