Как заиндексировать регулярные (под)выражения.
К.О.: на lex-е?
my @regexes = qw( ^aaa$ ^ccc bbb$ );
my $glued = join( '|', map { "($_)" } @regexes );
my $str = 'wwwbbb';
if( $str =~ /$glued/ ) {
if( $1 ) {
print "1\n";
}
if( $2 ) {
print "2\n";
}
if( $3 ) {
print "3\n";
}
}
[xoft ~]$ perl -l -e '"aaa" =~ /^aaa$(?{$x=1})|^ccc(?{$x=2})|bbb$(?{$x=3})/; print $x'
1
[xoft ~]$ perl -l -e '"ccc" =~ /^aaa$(?{$x=1})|^ccc(?{$x=2})|bbb$(?{$x=3})/; print $x'
2
[xoft ~]$ perl -l -e '"bbb" =~ /^aaa$(?{$x=1})|^ccc(?{$x=2})|bbb$(?{$x=3})/; print $x'
3
ассоциативная память выдаёт слово ragel
Оставить комментарий
Yulka-MOl
Привет.Задача такая. Есть список регулярных выражений.
Например:
^aaa$
^ccc
bbb$
Формат свободный - perl или grep - и задан заранее.
При этом реальные данные достаточно просты: испоьзуются '(', '|', ')' и '.*', но ничего более сложного ,
Каждому выражению ставим в соответствие число.
^aaa$ 1
^ccc 2
bbb$ 3
Общий шаблон строим объединяя наши выражения через "pipe" (символ '|').
^aaa$|^ccc|bbb$
Теперь я хочу пробежать им по тексту, а, когда что-то совпадёт, выяснить - какому индексу это соответствовало.
Может кто подсказать - в каких библиотеках я могу это сделать?
Смотрел уже boost, pcre. Найти ничего не смог.
Язык C++. Но можно также подсказать, как такое сделать на python, java, других языках.
Заранее спасибо.