Как заиндексировать регулярные (под)выражения.

Yulka-MOl

Привет.
Задача такая. Есть список регулярных выражений.
Например:
^aaa$
^ccc
bbb$
Формат свободный - perl или grep - и задан заранее.
При этом реальные данные достаточно просты: испоьзуются '(', '|', ')' и '.*', но ничего более сложного ,
Каждому выражению ставим в соответствие число.
^aaa$ 1
^ccc 2
bbb$ 3
Общий шаблон строим объединяя наши выражения через "pipe" (символ '|').
^aaa$|^ccc|bbb$
Теперь я хочу пробежать им по тексту, а, когда что-то совпадёт, выяснить - какому индексу это соответствовало.
Может кто подсказать - в каких библиотеках я могу это сделать?
Смотрел уже boost, pcre. Найти ничего не смог.
Язык C++. Но можно также подсказать, как такое сделать на python, java, других языках.
Заранее спасибо. :)

rosali

К.О.: на lex-е?

Bibi


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";
}
}

rosali

кстати на перле можно сделать что-нибудь полезное через чудесный оператор (?{})

[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

margadon

ассоциативная память выдаёт слово ragel
Оставить комментарий
Имя или ник:
Комментарий: