一行程序正则匹配问题

一行程序正则匹配问题

现在有一个文本文件1.txt

domain/db.abc.com
domain/cent.com.cn.db
domain-bak/fdjjkl.com.cn.db
domain-bak/addd.hk.db.bak

难点在于
  1.    "/"前面有2种选择 domain和domain-bak
   2.    "/"后面有3种选择 db+域名、域名+.db、域名+.db.bak
        

现在我主要想匹配得到域名,

perl -ne 'print $1."\n" if  /domain(?:-bak)*\/(?:db.)*(.*)(?:\.db)*(?:\.db\.bak)*/' 1.txt


abc.com
cent.com.cn.db
fdjjkl.com.cn.db
addd.hk.db.bak

似乎没有匹配到想要的域名


[Copy to clipboard] [ - ]
CODE:
perl -ne 'print $1."\n" if  /domain(?:-bak)?\/(?:db\.)?(.+?)(?:\.db)?(?:\.db\.bak)?/' 1.txt

非贪婪匹配


QUOTE:
原帖由 churchmice 于 2008-8-20 18:39 发表

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

非贪婪匹配

这个不对吧,我运行的结果是:
a
c
f
a

一个正则没想出来,分2步:

perl -ne 's#.*/##;s/(^db\.)|(\.db$)|(\.db\.bak$)//;print'
这个如何

[Copy to clipboard] [ - ]
CODE:
perl -ne 'print "$1\n" if  /domain(?:-bak)?\/(?:db\.)?(.*?)(?:(?:\.db)|(?:\.db\.bak))?$/' 1.txt

abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk



QUOTE:
原帖由 redicaps 于 2008-8-20 23:07 发表
这个如何

perl -ne 'print "$1\n" if  /domain(?:-bak)?\/(?:db\.)?(.*?)(??:\.db)|(?:\.db\.bak))?$/' 1.txt

abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk

还不错,谢谢

我还试了这几个都管用,原来少写了一个$

[Copy to clipboard] [ - ]
CODE:
[chenzq@web ~]$ perl -ne 'print $1."\n" if  /domain(?:-bak)?\/(?:db.)?(.*?)(?:\.db)*(?:\.db\.bak)*$/' 1.txt
abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk
[chenzq@web ~]$ perl -ne 'print $1."\n" if  /domain(?:-bak)?\/(?:db.)?(.*?)(?:\.db)?(?:\.db\.bak)*$/' 1.txt
abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk
[chenzq@web ~]$ perl -ne 'print $1."\n" if  /domain(?:-bak)?\/(?:db.)?(.*?)(?:\.db)?(?:\.db\.bak)?$/' 1.txt
abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk



QUOTE:
原帖由 churchmice 于 2008-8-20 18:39 发表

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

非贪婪匹配

把+号修改为*就行了,.+?号只会匹配第一个字母的,修改后就行了

[Copy to clipboard] [ - ]
CODE:
perl -ne 'print $1."\n" if  /domain(?:-bak)*\/(?:db.)*(.*?)(?:\.db)*(?:\.db\.bak)?$/' 1.txt
abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk


其实是$的问题

[Copy to clipboard] [ - ]
CODE:
kernel@fairland:~/chinaunix$ perl -ne 'print $1."\n" if  /domain(?:-bak)?\/(?:db\.)?(.+?)(?:\.db)?(?:\.db\.bak)?$/' 1.txt
abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk

perl -ne 'print $1."\n" if  /domain(?:-bak)*\/(?:db.)*(.*?)(?:\.db)*(?:\.bak)*$/' 1.txt

尝试学习,上面也是可以的


QUOTE:
原帖由 churchmice 于 2008-8-21 10:55 发表

其实是$的问题

kernel@fairland:~/chinaunix$ perl -ne 'print $1."\n" if  /domain(?:-bak)?\/(?:db\.)?(.+?)(?:\.db)?(?:\.db\.bak)?$/' 1.txt
abc.com
cent.com.cn
fdjjkl.com.cn
addd.hk

我也是知其然不知其所以然,有$没有$结果不一样,如果我匹配的字符串不是结尾,其后还有一些东东怎么办,希望哪位正则高手出来解析一下
方法也是有的

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