[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Для знатоков: зачем нужны условия в регулярках?
Placido
Собственно, сабж. Скажу сразу, я найти такой пример не смог. Возьмем пример из Википедии:
'/(а)?(?(1)м|п)/'

найдет
мам,пап

Подмаски:
\0 - ам, п
\1 а

Но то же самое можно записать проще:
'/(a)м|п/'

найдет
мам,пап

Все совпадает, даже возвращаемые подмаски -
\0 - ам, п
\1 а

Вопрос, в чем смысл?
Winston
Вот пример где условия пригодились http://phpforum.su/index.php?showtopic=0&v...dpost&p=1383726
Мне нигде не приходилось их использовать...
Placido
Спасибо! Да, интересная задача. Тоже поковырялся и сваял такое:

Свернутый текст
^(?x)
# --------------
# годы
# --------------
(?!0{4}) # не 0000
(?:
(?: # високосный год:
\d{2}(?!00)((?:[02468][048])|(?:[13579][26])) # \1 год, который делится на 4, но не век
| # или
(?1)00 # номер века, который делится на 400
)
|
( # \2 не високосный:
\d{4} # любой другой, кроме номеров столетий
)
)
\.
# --------------
(?: # месяцы
# --------------
(02) # \3 февраль
|
(0[469]|11) # \4 с 30 днями
|
0[13578]|10|12 # с 31 днями
)
\.
# --------------
# дни
# --------------
(?!00) # не 00
(?(3)
(?!30|31) # если это февраль, исключаем 30 и 31 числа
(?(2)(?!29)) # если это к тому же невисокосный год, исключаем 29 число
|
(?(4)(?!31)) # если это месяц с 30 днями, исключаем 31 число
)
([0-2][0-9]|30|31)$ # все возможные дни (месяц с 31 днем)

Хотел еще сократить, но оставил так, чтобы выражение было более понятным.
Можно скопировать в Notepad++, выделить, нажать Ctrl+F (вся выделенная область окажется в строке поиска), поставить галочку "Регулярные выражения" и протестировать, скажем, на следующем:

Свернутый текст
1352.01.01
2000.02.29
2004.08.30
2003.01.01
2001.02.29
1989.04.31
2040.02.29
2010.13.05
2011.11.32
0001.01.01
2100.02.30
2000.02.29
2100.02.29
2100.02.28
2100.02.05
2004.02.30
2004.02.29
2004.02.28
2100.02.05
2001.04.31
0400
160044.77
1700
210.6776833

Для возможности использования выражения "как есть" и в PHP, и в Notepad++, модификатор "x" "прикрутил" спереди - (?x).
Winston
Placido
Ого регулярка smile.gif Вот мое решение, если интересно, самое короткое кстати cool.gif
http://phpforum.su/index.php?showtopic=517...15#entry1487044
Placido
Я к особой краткости не стремился, хотел сделать его понятным. К тому же, ваши не работают в Notepad++)))
Winston
Цитата (Placido @ 12.12.2012 - 20:12)
хотел сделать его понятным

Для кого? Для начинающих это все равно китайская письменность smile.gif а для тех кто в теме и так все понятно будет smile.gif
Цитата (Placido @ 12.12.2012 - 20:12)
К тому же, ваши не работают в Notepad++

Если поменять \pN на \d то заработает и мой пример smile.gif
Placido
Твой вариант, кстати, говорит о том, что эту регулярку с условиями можно спокойно переписать без условий.
При этом я уверен, что любую регулярку с условиями можно переписать без условий, и во многих случаях она станет только короче.
Поэтому тема топика актуальна. Немного ее подкорректирую - покажите задачу, где регулярка с условиями будет короче, чем без условий.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.