За последние 24 часа нас посетили 17132 программиста и 1835 роботов. Сейчас ищут 1640 программистов ...

Два плюсика в регулярных выражениях

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

  1. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Здравствуйте. Иногда встречаю в регулярных выражениях два плюсика подряд ++ что это значит? Один плюсик я знаю что такое. Используется когда нужно одно или более совпадений. А что значит Два плюсика? Спасибо
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    забавно. я не знаю. а можно пример?
     
  3. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    preg_match('/^[a-zA-Z]++/', $string, $match);
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  5. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Спасибо за ссылку
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    да и мало где нужно. В тоннах проверок гигабайтов строк среди которых большая их часть шаблону не соответствует — там, к примеру, будет заметен выигрыш сверхжадного ++ против +.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я просто вообще слабо вкурил пример, где стоит вторая кавычка, но при этом супержадный хавает до конца строки, а не до кавычки. Не понял как заранее определить, что он схавает, если он правила не учитывает.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    выигрыш получается в скорости, из за того что при работе движка нет ненужных откатов, для проверки других вариантов.
    но использовать их с умом тоже нужно уметь. зачастую нельзя применять слишком общие описания шаблона(. \S и т.д.)
    т.е. нужно как можно конкретнее описывать то что мы ищем. чтобы ничего лишнего не попало под шаблон. и тогда отсутствие откатов даст прирост скорости.
    правила все соблюдаются точно также. сверхжадные работают также как жадные. т.е. подшаблон будет жрать строку до тех пор пока она подходит под описанное правило подшаблона. А как только пойдет чтото неподходящее, то начнет проверяться сразу следующая часть регулярки. а жадные бы еще раз сделали откат - и посмотрели может то что подходит под следующий подшаблон УЖЕ есть в том что мы съели.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мне казалось они последовательно ищут символы, и не могут проскочить.
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    на самом деле поиск идет совсем непоследовательно.
    там куча ветвлений и откатов может быть в зависимости от сложности рег выражения. тоесть движек пребирает всё множество возможных вариантов, ища в строке каждый вариант.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это я знаю.

    Добавлено спустя 9 минут 55 секунд:
    из статьи
    короче я походу въехал. если ему сказать "жри все любые символы", то он любые все и сожрёт, какие вообще есть. поэтому он вторую кавычку захавает.

    Добавлено спустя 4 минуты 37 секунд:
    у меня просто движочек мой на регулярках работает. но и так вполне быстро. но можно поискать, где соптимизировать.
     
  12. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    да. и жадные и сверхжадные схавают всё до конца.
    встретив Конец строки-
    - жадные увидят, а в шаблоне же еще есть последняя кавычка, и сделают откат . тоесть из УЖЕ СЪЕДЕНЕГО еще раз проверят - а последняя там была не кавычка ли? увидят что кавычка - всё. конец обработки. строка сматчилась!
    - сверхжадные увидят, а в шаблоне же еще есть последняя кавычка, но отката делать не будут. но это УЖЕ конец строки, сравнивать больше нечего, а в шаблоне еще несматчилась последняя кавычка. значит всё. конец обработки. строка НЕсматчилась!
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    окей, в жадные частично врубился.

    вот дальше там по статье:
    я не понимаю, он хочет найти текст типа
    Код (Text):
    1. ололо "лалала \"жужужу\" пыщпыщ" упячка
    вот типа экранированные кавычки пропустить хочет. но я это выражение и объяснение не понял. Т.е. он ищет только заслешенные символы получается?
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    /" ( \\. | [^"\\] )* "/x
    Это выражение не рабочее, а если бы и было рабочее, то скорее он тут убирает \"жужужу\" и оставляет только получается 2 найденных в кавычках:

    [0] => "лалала"
    [1] => "пыщпыщ"


    Причем при всем они оба будут в кавычках.
    Срань короче.