Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нахождения без захвата
 
 автор: demonow   (08.04.2012 в 22:50)   письмо автору
 
 

Никак не могу понять до конца, в чем суть подобных выражений
(\S+)(?=\s*);

  Ответить  
 
 автор: cheops   (08.04.2012 в 23:09)   письмо автору
 
   для: demonow   (08.04.2012 в 22:50)
 

Под сутью что имеется в виду вот этот участок "(?"? Просто скобки довольно удобная вещь не только для захвата, но и для группировки, иногда нужно содержимое 2-3 скобок, а в выражении их добрый десяток, этот прием позволяет часть скобок использовать только для группировки, ничего не захватывая.

  Ответить  
 
 автор: demonow   (08.04.2012 в 23:13)   письмо автору
 
   для: cheops   (08.04.2012 в 23:09)
 

да "?"

  Ответить  
 
 автор: cheops   (08.04.2012 в 23:18)   письмо автору
 
   для: demonow   (08.04.2012 в 23:13)
 

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

Регулярные выражения это очень специальный, декларативный язык. Императивные языки вроде C или PHP вам тут никак не помогут (хотя если возьмете другой императивный язык, помогут и здорово), поэтому при изучении таких специальных языков, следует настроиться на изучение с нуля.

  Ответить  
 
 автор: demonow   (08.04.2012 в 23:21)   письмо автору
 
   для: cheops   (08.04.2012 в 23:18)
 

дак, я с нуля и учу, про специальные символы знаю, просто непонятен именно данный пример.
получается что сначало идёт проверка на подвыражение (\S+) потом проверяется та же строка только подвыражением (?=\s+), то-есть даная конструкция проверяет повторно ту же строку.?

  Ответить  
 
 автор: cheops   (08.04.2012 в 23:26)   письмо автору
 
   для: demonow   (08.04.2012 в 23:21)
 

Дело в том, что тут следует рассматривать (?=...), которое означает, что справа должен быть символ внутри этих скобок, т.е. сначала идет один или более не пробельных символов (\S+), справа от которых должны быть пробельные символы.

  Ответить  
 
 автор: demonow   (09.04.2012 в 10:09)   письмо автору
 
   для: cheops   (08.04.2012 в 23:26)
 

Спасибо

  Ответить  
 
 автор: Sfinks   (09.04.2012 в 02:23)   письмо автору
 
   для: demonow   (08.04.2012 в 22:50)
 

\S+ -один или более НЕ пробельный символ
\s* -ноль или более пробельных символов
(?=выражение) -называется "положительный просмотр вперед". Т.е. после этой точки должно быть то, что указано в выражении.

Но тут есть НО! По идее это РВ должно выдавать ошибку, т.к. в положительных/отрицательных просмотрах вперед/назад выражение должно быть фиксированной длинны, а не от 0 до бесконечности.

  Ответить  
 
 автор: demonow   (09.04.2012 в 10:09)   письмо автору
 
   для: Sfinks   (09.04.2012 в 02:23)
 

Спасибо

  Ответить  
 
 автор: demonow   (09.04.2012 в 10:09)   письмо автору
 
   для: Sfinks   (09.04.2012 в 02:23)
 

Спасибо

  Ответить  
 
 автор: demonow   (18.04.2012 в 19:32)   письмо автору
 
   для: Sfinks   (09.04.2012 в 02:23)
 

Но какой смысл в записи после ?= если можно просто продолжить выражение?
Если не трудно киньте пару ссылочек толковых, а то чете не смог найти нормальной статьи по этой теме.Спасибо.

  Ответить  
 
 автор: cheops   (18.04.2012 в 21:23)   письмо автору
 
   для: demonow   (18.04.2012 в 19:32)
 

Ссылками трудно обойтись. Лучше на словах. Регулярное выражение "захватывает" то что оно нашло. Т.е. если вы используете preg_match_all() для поиска множества совпадений, то что попало в одно совпадение уже не может быть задействовано в другом. Положительные и ретроспективные проверки, позволяют не включать то, что они нашли в "захват". Т.е. не смотря на то, что эта информация поучаствовала в формировании этого вхождения, она может потом повторно использоваться для поиска нового вхождения. Будь на месте положительной или ретроспективной проверки обычные скобки - это было бы уже невозможно.

PS Словами трудно передать важность этих казалось бы незначительных деталей, это очень хорош видно на практике.

  Ответить  
 
 автор: demonow   (18.04.2012 в 22:59)   письмо автору
 
   для: cheops   (18.04.2012 в 21:23)
 

да, я тоже так думаю.Спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования