Re: [問題] 常規表示式的比對問題?
給你參考看看!
利用一些取代把那些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
04/08 20:21, 2F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 2 之 4 篇):
Perl 近期熱門文章
PTT數位生活區 即時熱門文章