3

SOとGoogleでかなり検索した後、私は新しい質問を投稿することにしました。私はTextWranglerと協力して、複数行のパターンの最短一致を提供する正規表現を作成しようとしています。

基本的に、

ہے\tVM

は私が探している文字列です(品詞タグからタブ文字で区切られたアラビア語)。難しいのは、その文字列を含むすべての単一の文を検索したいということです。これが私がこれまでに持っているものです:

/(<Sentence id='\d+'>(?:[^<]|<(?!\/Sentence>))*ہے\tVM(?:[^<]|<(?!\/Sentence>))*<\/Sentence>)/

私が見ているファイルはCMLでエンコードされているので、私の質問の一部は、MAC用のCMLパーサーを知っている人がいるかどうかです。

もう1つの明らかな代替手段は、Perlスクリプトを作成することです。ここでも、簡単な解決策を示すアドバイスに感謝しています。


私の現在のスクリプトは次のとおりです。

use open ':encoding(utf8)';
use Encode;
binmode(STDOUT, ":utf8");
binmode(STDIN, ":utf8");

my $word = Encode::decode_utf8("ہے");

my @files = glob("*.posn");

foreach my $file (@files) {
    open FILE, "<$file" or die "Error opening file $file ($!)";
    my $file = do {local $/; <FILE>};
    close FILE or die $!;
    if ($file =~ /(<Sentence id='\d+'>(?:[^<]|<(?!\/Sentence>))*$word\tVM(?:[^<]|<(?!\/Sentence>))*<\/Sentence>)/g) {
            print STDOUT "$1\n\n\n\n";
            push(@matches, "$1\n\n");
            }
}

open(OUTPUT, ">matches.txt");
print OUTPUT "@matches";
close(OUTPUT);
4

1 に答える 1

0

入力に文字列がさらに出現する可能性があるため、それらすべてを検索してください...

コードは次のようになると思います >>

use open ':encoding(utf8)';
use Encode;

binmode(STDOUT, ":utf8");
binmode(STDIN,  ":utf8");

my $word = Encode::decode_utf8("ہے");
my @files = glob("*.posn");
my @matches = ();

foreach my $file (@files) {
  open FILE, "<$file" or die "Error opening file $file ($!)";
  my $file = do {local $/; <FILE>};
  close FILE or die $!;
  my @occurrences = $file =~ /<Sentence id='\d+'>(?:[^<]|<(?!\/Sentence>))*$word\tVM(?:[^<]|<(?!\/Sentence>))*<\/Sentence>/g;
  print STDOUT "$_\n\n\n\n" for (@occurrences);
  push (@matches, "$_\n\n") for (@occurrences);
}

open (OUTPUT, ">matches.txt");
print OUTPUT  "@matches";
close(OUTPUT);

正規表現の詳細については、こちらをご覧ください。

于 2012-11-15T12:08:33.637 に答える