作者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
推 Yaowei:十分感謝你 困擾了我許久的問題= =要多多學習了 04/08 00:12
※ 編輯: fuu0115 來自: 220.135.62.188 (04/08 10:07)
推 Yaowei:但我發現有個小問題就是若是2212則不會讀到221而是212= = 04/08 20:21