Как уже отмечали другие, хеш является очевидным кандидатом для вашей структуры данных.
Однако для целей разработки и тестирования я бы хотел, чтобы эта структура была богаче простого подсчета для каждого соответствующего элемента. Скорее, я бы хотел хранить информацию, которую можно было бы использовать для подтверждения правильности кода.
Для начала эта информация может содержать номер строки и некоторое указание позиции, где произошло совпадение. Вот иллюстрация в Perl:
use strict;
use warnings;
my %regexes= (
rep_letter => qr/ ([a-z]) (\1 )+ /x,
rep_word => qr/ (\b \w+ \b) \W* (\1\W*)+ /x,
doub_word => qr/ (\b \w+ ) \W+ \1 /x,
);
my %ds;
while (my $line = <>){
for my $r (keys %regexes){
while ( $line =~ /$regexes{$r}/g ){
# Data structure:
# $ds{REGEX_TYPE}{REPEATED_ITEM} = [
# [LINE_NO, pos_VALUE_OF_MATCH],
# etc. for each match
# ]
#
# For example:
# $ds{rep_word}{foo} = [
# [ 3, 11],
# [12, 88],
# ...
# ]
push @{$ds{$r}{$1}}, [$., pos($line)];
}
}
}