То, что вы предлагаете, сложно, но выполнимо .
Если я могу перефразировать то, что я понимаю, вы хотите узнать, как далеко неудачный матч попал в матч. Чтобы сделать это, вы должны быть в состоянии разобрать регулярное выражение.
Лучшим анализатором регулярных выражений, вероятно, является использование самого Perl с ключом командной строки -re=debug
:
$ perl -Mre=debug -e'"abcdefghijklmnopqr"=~/gh[ijkl]{5}/'
Compiling REx "gh[ijkl]{5}"
Final program:
1: EXACT <gh> (3)
3: CURLY {5,5} (16)
5: ANYOF[i-l][] (0)
16: END (0)
anchored "gh" at 0 (checking anchored) minlen 7
Guessing start of match in sv for REx "gh[ijkl]{5}" against "abcdefghijklmnopqr"
Found anchored substr "gh" at offset 6...
Starting position does not contradict /^/m...
Guessed: match at offset 6
Matching REx "gh[ijkl]{5}" against "ghijklmnopqr"
6 <bcdef> <ghijklmnop> | 1:EXACT <gh>(3)
8 <defgh> <ijklmnopqr> | 3:CURLY {5,5}(16)
ANYOF[i-l][] can match 4 times out of 5...
failed...
Match failed
Freeing REx: "gh[ijkl]{5}"
Вы можете выложить эту командную строку Perl своим регулярным выражением и проанализировать возвращение stdout. Ищите `
Вот подходящее регулярное выражение:
$ perl -Mre=debug -e'"abcdefghijklmnopqr"=~/gh[ijkl]{3}/'
Compiling REx "gh[ijkl]{3}"
Final program:
1: EXACT <gh> (3)
3: CURLY {3,3} (16)
5: ANYOF[i-l][] (0)
16: END (0)
anchored "gh" at 0 (checking anchored) minlen 5
Guessing start of match in sv for REx "gh[ijkl]{3}" against "abcdefghijklmnopqr"
Found anchored substr "gh" at offset 6...
Starting position does not contradict /^/m...
Guessed: match at offset 6
Matching REx "gh[ijkl]{3}" against "ghijklmnopqr"
6 <bcdef> <ghijklmnop> | 1:EXACT <gh>(3)
8 <defgh> <ijklmnopqr> | 3:CURLY {3,3}(16)
ANYOF[i-l][] can match 3 times out of 3...
11 <ghijk> <lmnopqr> | 16: END(0)
Match successful!
Freeing REx: "gh[ijkl]{3}"
Вам потребуется создать синтаксический анализатор, который может обработать возврат из отладчика Perl re. Левая и правая угловые скобки показывают расстояние до строки, когда двигатель регулярных выражений пытается соответствовать.
Кстати, это нелегкий проект ...