Разбор html-комментариев с использованием функции разделения Perl - PullRequest
0 голосов
/ 03 марта 2019

У меня есть функция split, которая разбивает строки в документе .txt на основе пробелов и специальных символов и преобразует их в нижний регистр, чтобы подсчитать общее количество слов, присутствующих в документе.Сейчас я пытаюсь расширить регулярное выражение, чтобы все html-комментарии, включая все слова внутри них, рассматривались как разделители, но я не могу заставить обновленное регулярное выражение работать правильно.

my @words = split /(?:([_\W\s\d]|(<(\w+)>.*<\/\>)))+/, $text;
 #count strings
  %count = ();
  foreach $word (@words) {
    @count{map lc, @keys} =
    map lc, delete @count{@keys = keys %count};
    $count{$word}++;
  }
   foreach $key (keys %count) {
    print $key, $count{$key};
   } 

В настоящее время первый класс charcter

 [_\W\s\d]+ 

работает нормально, но я не могу заставить второй

 |(<(\w+).*\/\>)+

функционировать корректно при совместном использовании,второй класс символов не работает правильно, и пробел считается словом.в идеале желаемый вывод должен разделять слова между пробелами и специальными символами, а также разделять HTML-комментарии (фактически игнорируя любые слова между тегами комментариев)

Я не уверен, что смогу использовать два класса символов в разделениифункционировать или нет?все еще справляюсь с регулярным выражением!

1 Ответ

0 голосов
/ 04 марта 2019

Поскольку вы сказали, что анализируете документ .txt (со встроенными HTML-комментариями), вы можете попробовать Regexp::Grammars.Вот отправная точка:

use strict;
use warnings;
use Regexp::Grammars;

my $parser = qr{   
          <nocontext:>
          <words>
          <token: words> (?:(?:<[word]><[separator]>?)|(?:<[separator]><[word]>?))+
          <token: word> <.wordchar>+
          <token: separator> <.comment> | (?:(?:(?!<.comment>)(?!<.wordchar>)).)+
          <token: wordchar> [a-zA-Z]
          <token: comment> \< <.wordchar>+ \> [^<]* \</\>
}sx;

my $fn = 'file.txt';
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $text = do { local $/; <$fh> };
close $fh;

if ($text =~ $parser) {
    for my $word (@{ $/{words}{word} } ) {
        print "'", $word, "'\n";
    }
}
...