Re: [問題] 常規表示式的比對問題?

看板Perl作者 (充實計劃啟動)時間18年前 (2007/04/07 23:56), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串2/4 (看更多)
給你參考看看! 利用一些取代把那些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

04/08 00:12, , 1F
十分感謝你 困擾了我許久的問題= =要多多學習了
04/08 00:12, 1F
※ 編輯: fuu0115 來自: 220.135.62.188 (04/08 10:07)

04/08 20:21, , 2F
但我發現有個小問題就是若是2212則不會讀到221而是212= =
04/08 20:21, 2F
文章代碼(AID): #165xyMX9 (Perl)
文章代碼(AID): #165xyMX9 (Perl)