Использование регулярных выражений для поиска любого последнего вхождения слова между двумя разделителями - PullRequest
0 голосов
/ 26 июля 2010

Предположим, у меня есть следующая тестовая строка:

Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get_Stop

где _ означает любые символы, например: StartaGetbbGetcccGetddddStopeeeeeStart .... * 100 * требуется * любой 5последнее вхождение слова Get в разделители Start и Stop.Результатом здесь будет три полужирных Get ниже.

Start__Get__Get __ Get __ Stop__Start__Get __ Get __ Stop__Start __ Get __ Stop

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

Любые предложения приветствуются

Спасибо '

Ответы [ 5 ]

1 голос
/ 27 июля 2010
Get(?=(?:(?!Get|Start|Stop).)*Stop)

Я предполагаю, что ваши разделители Start и Stop всегда будут правильно сбалансированы и не могут быть вложенными.

0 голосов
/ 26 июля 2010

С Perl я бы сделал:

my $test = "Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get_Stop";
$test =~ s#(?<=Start_)((Get_)*)(Get)(?=_Stop)#$1<FOUND>$3</FOUND>#g;
print $test;

выход:

Start_Get_Get_<FOUND>Get</FOUND>_Stop_Start_Get_<FOUND>Get</FOUND>_Stop_Start_<FOUND>Get</FOUND>_Stop

Вы должны адаптироваться к своему вкусу регулярных выражений.

0 голосов
/ 26 июля 2010
$ echo "Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get__Stop" | awk -vRS="Stop" -F"_*" '{print $(NF-1)}'
Get
Get
Get
0 голосов
/ 26 июля 2010

Примерно так, может быть:

(?<=Start(?:.Get)*)Get(?=.Stop)

Для этого требуется поддержка просмотра за разную длину, которую поддерживают не все движки регулярных выражений.
Можно сделать так, чтобы иметь максимальную длину, которую поддерживают еще несколько (но все еще не все), изменив первый * на {0,99} или аналогичный.

Кроме того, в перспективе, возможно, . должно быть .+ или .{1,2} в зависимости от того, является ли двойное подчеркивание опечаткой или нет.

0 голосов
/ 26 июля 2010

Я бы сделал это за два прохода. На первом проходе найдите слово «Get», а на втором проходе посчитайте количество его появлений.

...