作者fuu0115 (充实计划启动)
看板perl
标题Re: [问题] 常规表示式的比对问题?
时间Sat Apr 7 23:56:05 2007
给你参考看看!
利用一些取代把那些ACT, PTN取代成一个符号,
然後就可以利用一些规则把pattern过滤出来。
#!/usr/bin/perl -w
use strict;
open FH, "<$ARGV[0]" or die "file open fail:$!";
while (my $thisLine = <FH>) {
if ($thisLine eq "") {
next;
}
$thisLine =~ s{\s+$}{};
my $list;
while ($thisLine =~ m{(ACT|PTN)}g){
$list .= $1;
}
$list =~ s{ACT}{1}g;
$list =~ s{PTN}{2}g;
$list =~ s{1{3,}}{1}g;
$list =~ s{2{3,}}{2}g;
print "####$list#### ";
if ($list =~ m{212}) {
print "class 1\n";
}
elsif ($list =~ m{122}) {
print "class 2\n";
}
elsif ($list =~ m{221}) {
print "class 3\n";
}
else {
print "no match\n"
}
}
close FH;
※ 引述《Yaowei (开心)》之铭言:
: 若我有三种可能分别是
: 1. PTN ACT PTN 、 ACT PTN PTN 与 PTN PTN ACT
: 而我想将输入的句子丢入後判断它们到底属於哪一类?
: p.s. 在各PTN ACT之间可能它们的前後有无字出现皆有可能
: 所以也是有可能会出现PTN 或 ACT的字
: 但我只想要取得最小的范围就好,当上述的其中一种情况成立的话
: 例子如下:
: AA ACT with PTN CC PTN
: ==>属於第二类 ACT PTN PTN
: ------------------------------
: that PTN ACT to of PTN at
: ==>属於第一类 PTN ACT PTN
: ------------------------------
: PTN ACT that ACT to and ACT PTN
: ==>属於第一类 PTN ACT PTN
: ------------------------------
: aaa ACT between PTN and PTN
: ==>属於第二类
: ------------------------------
: abcd and cc PTN cc PTN aa ACT
: ==>属於第三类
: 只是我使用常规表示式若写成下列的话
: 则第二类会永远被比成第一类,根本不会比对到第二类去
: while(<LINE>){
: if(/(.*)?(PTN.*ACT.*PTN).*?/){
: print "目前的情况是1:PTN ACT PTN\n";
: print "1.抓到的\$&:",$&,$/;
: print "-------------------------\n";
: }elsif(/(.*)?ACT.*PTN.*PTN.*?/){
: print "目前的情况是2:ACT PTN PTN\n";
: print "2.抓到的\$&:",$&,$/;
: print "-------------------------\n";
: }else{
: print "目前的情况是3:PTN PTN ACT\n";
: print "3.抓到的\$&:",$&,$/;
: print "-------------------------\n";
: }
: }
: 请问是否要改什麽地方会比较好呢^^?感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.62.188
1F:推 Yaowei:十分感谢你 困扰了我许久的问题= =要多多学习了 04/08 00:12
※ 编辑: fuu0115 来自: 220.135.62.188 (04/08 10:07)
2F:推 Yaowei:但我发现有个小问题就是若是2212则不会读到221而是212= = 04/08 20:21