|
|
|
| Никак не могу понять до конца, в чем суть подобных выражений
(\S+)(?=\s*); | |
|
|
|
|
|
|
|
для: demonow
(08.04.2012 в 22:50)
| | Под сутью что имеется в виду вот этот участок "(?"? Просто скобки довольно удобная вещь не только для захвата, но и для группировки, иногда нужно содержимое 2-3 скобок, а в выражении их добрый десяток, этот прием позволяет часть скобок использовать только для группировки, ничего не захватывая. | |
|
|
|
|
|
|
|
для: cheops
(08.04.2012 в 23:09)
| | да "?" | |
|
|
|
|
|
|
|
для: demonow
(08.04.2012 в 23:13)
| | Вообще у многих знаков в регулярных выражениях имеются специальные значения, т.е. ни сами по себе ничего не значат, а изменяют поведение символов перед ними. Вот знак вопроса как раз из таких. Более того, он таких значений имеет очень много, т.е. он ни в одной и не в двух конструкциях используется, поэтому нужно внимательно следить что его окружает. Из радостного, не смотря на то, что он имеет несколько вариантов - количество этих вариантов конечно.
Регулярные выражения это очень специальный, декларативный язык. Императивные языки вроде C или PHP вам тут никак не помогут (хотя если возьмете другой императивный язык, помогут и здорово), поэтому при изучении таких специальных языков, следует настроиться на изучение с нуля. | |
|
|
|
|
|
|
|
для: cheops
(08.04.2012 в 23:18)
| | дак, я с нуля и учу, про специальные символы знаю, просто непонятен именно данный пример.
получается что сначало идёт проверка на подвыражение (\S+) потом проверяется та же строка только подвыражением (?=\s+), то-есть даная конструкция проверяет повторно ту же строку.? | |
|
|
|
|
|
|
|
для: demonow
(08.04.2012 в 23:21)
| | Дело в том, что тут следует рассматривать (?=...), которое означает, что справа должен быть символ внутри этих скобок, т.е. сначала идет один или более не пробельных символов (\S+), справа от которых должны быть пробельные символы. | |
|
|
|
|
|
|
|
для: cheops
(08.04.2012 в 23:26)
| | Спасибо | |
|
|
|
|
|
|
|
для: demonow
(08.04.2012 в 22:50)
| | \S+ -один или более НЕ пробельный символ
\s* -ноль или более пробельных символов
(?=выражение) -называется "положительный просмотр вперед". Т.е. после этой точки должно быть то, что указано в выражении.
Но тут есть НО! По идее это РВ должно выдавать ошибку, т.к. в положительных/отрицательных просмотрах вперед/назад выражение должно быть фиксированной длинны, а не от 0 до бесконечности. | |
|
|
|
|
|
|
|
для: Sfinks
(09.04.2012 в 02:23)
| | Спасибо | |
|
|
|
|
|
|
|
для: Sfinks
(09.04.2012 в 02:23)
| | Спасибо | |
|
|
|
|
|
|
|
для: Sfinks
(09.04.2012 в 02:23)
| | Но какой смысл в записи после ?= если можно просто продолжить выражение?
Если не трудно киньте пару ссылочек толковых, а то чете не смог найти нормальной статьи по этой теме.Спасибо. | |
|
|
|
|
|
|
|
для: demonow
(18.04.2012 в 19:32)
| | Ссылками трудно обойтись. Лучше на словах. Регулярное выражение "захватывает" то что оно нашло. Т.е. если вы используете preg_match_all() для поиска множества совпадений, то что попало в одно совпадение уже не может быть задействовано в другом. Положительные и ретроспективные проверки, позволяют не включать то, что они нашли в "захват". Т.е. не смотря на то, что эта информация поучаствовала в формировании этого вхождения, она может потом повторно использоваться для поиска нового вхождения. Будь на месте положительной или ретроспективной проверки обычные скобки - это было бы уже невозможно.
PS Словами трудно передать важность этих казалось бы незначительных деталей, это очень хорош видно на практике. | |
|
|
|
|
|
|
|
для: cheops
(18.04.2012 в 21:23)
| | да, я тоже так думаю.Спасибо | |
|
|
|