Regexp

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Regexp

Непрочитанное сообщение iye » 2010-09-07 9:13:29

Приветствую!
Не знал в какую тему запихнуть, но использую в контексте перла. Кто подскажет чем в регекспе '^' отличается от '\A' и '$' от '\z' ? Заранее благодарен за ответы.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Regexp

Непрочитанное сообщение skeletor » 2010-09-07 9:33:20

^ - начало строки
$ - конец строки
\A - символ А
\z - символ z

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Regexp

Непрочитанное сообщение iye » 2010-09-07 9:37:35

Вы не правы. \A - в кэмлбуке написано "True в начале строки" \z то же в конце. + есть пример:

Код: Выделить всё

if ( $input !~ /\A\d+\z/ ) {
      return("input is NaN");
    }
Который должен смотреть цифирь у нас в инпуте или нет.


Гость
проходил мимо

Re: Regexp

Непрочитанное сообщение Гость » 2010-09-07 9:51:31

отличия только поддержкой первыми мульти лайн режима
\A \z не поддерживают его

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Regexp

Непрочитанное сообщение skeletor » 2010-09-07 10:13:22

Не знал о таких возможностях.

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Regexp

Непрочитанное сообщение iye » 2010-09-07 10:15:29

Спасибо!

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Regexp

Непрочитанное сообщение iye » 2010-09-16 17:18:06

Приветствую!
Чтобы не плодить сущности напишу тут:
Под конец рабочего дня столкнулся вот с таким чудом:

Код: Выделить всё

 $title = "Lambada 2004";
$title =~ m/([0-4]*)/;
Не могу понять почему $1 - пустая строка .... если про звездочку на http://www.regular-expressions.info/reference.html ясно сказано:
Greedy, so as many items as possible will be matched

Гость
проходил мимо

Re: Regexp

Непрочитанное сообщение Гость » 2010-09-17 1:02:26

* - это от 0 и до инфинити
алгоритм примерно такой:
1) чё в паттерне? ага, цифры от 0 до 4, причём из-за * движок прекращает поиск, если не совпадает исследуемый символ с паттерном
2) первым исследуемым символом у нас идёт буква L, что не совпадает с [0-4]
3) ну вот и всё, значит в $1 пишем пустую строку

а был бы ([0-4]+), то движок бы искал по всей строке цифры от 0 до 4...

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Regexp

Непрочитанное сообщение iye » 2010-09-17 8:17:38

Не понятно следующее: Почему * матчит только 1 символ (у нас ведь стоит не *?) - ведь он должен быть "жадным" и продолжать поиск до последнего...

Гость
проходил мимо

Re: Regexp

Непрочитанное сообщение Гость » 2010-09-17 10:22:25

...из-за * движок прекращает поиск, если исследуемый символ не совпадает с паттерном
2) первым исследуемым символом у нас идёт буква L, что не совпадает с [0-4]
Да, * - жадный символ, но (из man'a):
* Match 0 or more times
и с самого-самого начала строки "Lambda 2004" у нас получается буква "L", которая "Match 0 ..." для паттерна [0-4] =>
* не матчит в данном случае ничего и в $1 ничего не заносит.

Вот другой пример: если бы входная строка была бы "2004 Lambda", то в $1 у нас бы запихнулось 2004 (он ведь "жадный", а это значит он бы в $1 заносил цифры до тех пор, пока ещё действует паттерн [0-4]), потому что начиная с самого первого символа уже начинаются цифры, которые находятся в паттерне [0-4].
Но если перед 2004 поставим хоть что-то, что не совпадает с [0-4], то всё, в $1 будет пустая строка.

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Regexp

Непрочитанное сообщение iye » 2010-09-17 11:15:13

Спасибо!