Подсчет совпадений регулярных выражений в Perl ИЛИ Ruby - PullRequest
2 голосов
/ 18 февраля 2012

Это продолжение этого вопроса .Я узнал, что найти перекрывающиеся совпадения с регулярными выражениями в Python непросто, поэтому решил сделать дополнительный запрос, чтобы узнать, как Perl и Ruby справляются с этой задачей.

Я бы хотел count количество всех возможных совпадений регулярного выражения с определенной строкой.Под словом «все» я подразумеваю, что результат должен учитывать как перекрывающиеся, так и неуникальные совпадения.Вот несколько примеров:

  • a.*k должно совпадать дважды в "akka"
  • "bbboob", проверенных против b.*o.*b, должно дать 6

Для справки, вот одна строчка Perl, предложенная tchrist - она ​​выводит правильные совпадения и их количество:

() = "bbboobb" =~ /(b.*o.*b)(?{push @all, $1})(*FAIL)/g; printf "got %d matches: %s\n", scalar(@all), "@all";

Единственная проблема с этим состоит в том, что она тоже естмного ресурсов для тестовых случаев, когда итоговое число совпадений составляет порядка миллионов и более.Но я понимаю, что это связано с тем, что все матчи сначала группируются и учитываются только после.Я ищу ресурсосберегающее решение, которое возвращает только число .

1 Ответ

6 голосов
/ 18 февраля 2012

Похоже, Христ выполнил всю тяжелую работу.Если хранение совпадений и их последующий подсчет потребляют слишком много ресурсов, вы можете просто изменить встроенный в регулярное выражение код, чтобы просто подсчитывать совпадения:

my $count = 0;

"bbboobb" =~ /(b.*o.*b)(?{$count++})(*FAIL)/g;

print "got $count matches\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...