в регулярном выражении осуществляется при
Поиск повторяющихся слов в регулярном выражении осуществляется при помощи т.н. обратных ссылок. Выше уже был приведен пример их использования для выбирания всех адресов рисунков с www.astronomynow.com:
m{SRC\s*=\s*(["'])http://(.*?)\1\s+(.*?)WIDTH="100" HEIGHT="100"(.*?)>}igs
(["']) - найти либо " либо ' либо ничего, т.к. src=http:// может быть без кавычек. Как только был надено что-либо из этих трех позиций, через минимальное количество символов(регулярное выражение (.*?)) символов оно заносится в специальную переменную \1, которая вне m/.../ может быть вызвана как $1(в s/.../.../ она вызывается в его левую половину как $1). Дальше после *.gif|*.jpg|*.bmp и т.д. должен обязательно идти хотя-бы один пробел \s+, т.к. броузеры воспримут подстроку src=file.gifborder=0 как файл картинки с расширением gifborder=0. Поэтому данное регулярное выражение вполне исправно работает, хотя оно было сделано для сайта, где в img src ставится полный адрес, т.е. начинающийся с http:// Для других сайтов придется выстраивать полные пути в ссылках используя base href, если есть или его url.
Если нужно найти какое-то по счету совпадение шаблона в строке, то это реализуется примерно так:
while($str=~/WHAT/g){$n++} $n++ while $str=~/WHAT/g; $n++ while $str=~/(?=WHAT)/g;#для перекрывающихся совпадений for($n=0; $n=~/WHAT/g; $n++){}
Каждое кратное совпадение
(++$n % 6) == 0;
Нужное Вам совпадение:
$n=($str=~/WHAT/gi)[6]; #допустим шестое
Или каждое четное совпадение
@mass=grep{$n++ %2==0} /WHAT/gi;
для нечетного нужно написать внутри grep: $n++ %2==1
Логические операции внутри регулярных выражений.
Если нужно найти последнее совпадение, то можно воспользоваться отрицанием опережающей проверки (?!WHAT):
m#PATTERN(?!.*PATTERN)$#
т.е. нийти какой-то PATTERN, при этом не должно найтись что-то еще(.*) и PATTERN, т.е. результат - последнее совпадение;
Минимальные квантификаторы *?, +?, ??,{}?
допустим нужно найти двойку, перед которой не стоит 3 или пробел:
Содержание Назад Вперед