Регулярное выражение поиска по нескольким строкам

После значительных поисков в SO и Google я прибегаю к публикации нового вопроса. Я работаю с TextWrangler, пытаясь составить регулярное выражение, которое даст мне кратчайшие совпадения многострочного шаблона.

В принципе,

ہے\tVM

это строка, которую я ищу (арабское слово, отделенное символом табуляции от своей части речевого тега). Что затрудняет то, что я хотел бы найти все отдельные предложения, содержащие эту строку. Вот что у меня так далеко:

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

Файлы, на которые я смотрю, кодируются в CML, поэтому часть моего вопроса заключается в том, знает ли кто-нибудь из вас о синтаксическом анализаторе CML для MAC?

Другой очевидной альтернативой является написание скрипта на 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);

1 ответ

Решение

Возможно, у вас может быть больше вхождений строки во входных данных, поэтому ищите их все...

Я считаю, что ваш код должен выглядеть вот так >>

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);

Узнайте больше о регулярных выражениях здесь.

Другие вопросы по тегам