Обратный поиск в регулярке

Тема в разделе "Регулярные выражения", создана пользователем Super_BOT, 22 апр 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    Есть примерно такая строка

    "14aaa 14bbb 14ссс 23"

    где 14 и 23 какие-то строки-признаки, по которым ищем, aaa, bbb, ccc - произвольный текст.
    Комбинаций вида 14aaa может быть сколько угодно. Вместо пробелов может стоять какой угодно текст.

    Нужно в этой строке вытащить строку ссс - то есть строка между ПОСЛЕДНЕЙ "14" и " 23"

    Как это можно сделтаь? то есть по сути поиск нужно начинать с конца, сначала найти 23, и от него предыдущее
     
  2. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    250
    Ну и зачем искать с конца... Делай в два прохода или три.
    Код:
    priznakA.*?priznakB
    priznakA.*?priznakC
    Ну и так далее...
     
  3. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    Ага, так то ясно, что можно рекурсивно это сделать, просто думаю такая задача должна решаться с помощью регулярных выражений.
     
  4. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    можно так
    PHP:
    <?php
    $stroka 
    "14aaa 14bbb 14ссс 23";
    $pos strripos($stroka,"14");
    $end strpos($stroka,"23");
    echo 
    substr($stroka,$pos,$end);
    ?>
     
  5. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    Так
    PHP:
    $text '14aaa 14bbb 14aaa23 14bbb23 14ссс23 qwe23rrrrr 14eeee';
    preg_match ('#.*14(.*)23#s',$text,$matches);
    echo 
    $matches[1]; //ссс23 qwe 
    Или так
    PHP:
    $text '14aaa 14bbb 14aaa23 14bbb23 14ссс23 qwe23rrrrr 14eeee';
    preg_match ('#.*14(.*?)23#s',$text,$matches);
    echo 
    $matches[1]; //ссс
     
    Super_BOT нравится это.
  6. perezzz

    perezzz Создатель

    Регистр.:
    9 сен 2007
    Сообщения:
    34
    Симпатии:
    1
    Из последнего, вытаскивай значение и сравнивай с начальным
     
  7. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Найти:
    ^.*?14(\w+).*?23\w+.*?$

    Заменить:
    \1

    Находим от начало строки какой угодно текст до 14 со словом, далее какой угодно текст до 23 со словом и с каким угодно текстом до конца строки.

    Если бы дал конкретный пример, то написал бы, а так по тому, что дал.

    Пример для поиска в рамках одной строки.
    Что бы все варианты учесть, то можно просто оставить
    14(\w+).*?23\w+
     
    Super_BOT нравится это.
  8. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    Всем спасибо, пример VandJ подошел.

    Фокус был в том чтобы в начале использовать .*
    Так как они работают по максимому, то дойдут до последней комбинации 14.
     
Статус темы:
Закрыта.