Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Шаблон американского времени (perl)

20K
14 сентября 2007 года
Eklmn
19 / / 07.02.2007
Всем привет.
Пытаюсь написать шаблон - не получается.
По условию под этот шаблон должны подходить 12:00am, 5:00pm и 8:30AM. Не должны подходить: 3:00, 2:60am, 99:00am, 3:0pm.
Получилось:

 
Код:
m/[0-1][0-9]:[0-5][0-9][pma]{2}/i


Как указать, что первая цифра ([0-1]) необязательна? Пробовал "?", "*" и что-то ещё. Не помогает. Сколько литературы по шаблонам не просмотрел, везде описывается одно и тоже (ограниченно как-то).
7.8K
14 сентября 2007 года
Tingo
201 / / 17.05.2007
 
Код:
m/[0-1]{0,1}[0-9]:[0-5][0-9][pma]{2}/i


Оно?
860
15 сентября 2007 года
Abell2000
138 / / 15.01.2003
а если я напишу 1:1pa или 1:1ap?
надо бы наверно (am|pm) поставить
20K
15 сентября 2007 года
Eklmn
19 / / 07.02.2007
Цитата: Tingo
Оно?


И да и нет. Уже пробовал такой вариант. По спецификации должен работать, но не работает. Под данный шаблон подходит как 5:00pm, так и 99:00am. А ведь такго быть не должно. :(

Цитата: Abell2000
а если я напишу 1:1pa или 1:1ap?
надо бы наверно (am|pm) поставить


Действительно. Что-то не думал над этим. :-) Однако тоже не работает. 0_о Принимается как pa, так ma и mp. Странно... Может, ActivePerl того этого? Шутит?

7.8K
15 сентября 2007 года
Tingo
201 / / 17.05.2007
насчет 99:00
m/[0-1]{0,1}[0-9]{1}:[0-5][0-9][pma]{2}/i

хотя думаю так лучше:
m/[0-1]{0,1}[0-9]{1}:[0-4]{0,1}[0-9]{1}(pm|am)/i

а?
12
15 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Eklmn
Сколько литературы по шаблонам не просмотрел, везде описывается одно и тоже (ограниченно как-то).


Да нет, литература нормальная есть. В манах кстати очень неплохо изложено. Хотя еще лучше написано вот тут: Регулярные выражения.


А регулярка долна быть в духе:

Код:
<?php
$str = '12:00am';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};

$str = '5:00pm';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};

$str = '8:30AM';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};

$str = '3:00';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};

$str = '2:60am';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};

$str = '99:00am';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};

$str = '3:0pm';
$a = preg_match('/^[0-1]?[0-9]:[0-5][0-9](am|pm)$/i',$str);
if ($a == 1)
{
    echo 'Строка '.$str.' проходит<br>';
}
else
{
    echo 'Строка '.$str.' НЕ проходит<br>';
};
?>
12
15 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Tingo
насчет 99:00
m/[0-1]{0,1}[0-9]{1}:[0-5][0-9][pma]{2}/i

хотя думаю так лучше:
m/[0-1]{0,1}[0-9]{1}:[0-4]{0,1}[0-9]{1}(pm|am)/i

а?


[0-1]{0,1} и [0-1]? эквивалентны, но второй более предпочтителен, т.к более короток.
[0-9]{1} и [0-9] эквивалентны, но.... опять же более коротная запись.

20K
16 сентября 2007 года
Eklmn
19 / / 07.02.2007
Цитата: Tingo
насчет 99:00
m/[0-1]{0,1}[0-9]{1}:[0-5][0-9][pma]{2}/i

хотя думаю так лучше:
m/[0-1]{0,1}[0-9]{1}:[0-4]{0,1}[0-9]{1}(pm|am)/i

а?



Разве указание [0-9] не равносильно [0-9]{1} ?


Цитата: alekciy
Да нет, литература нормальная есть. В манах кстати очень неплохо изложено. Хотя еще лучше написано вот тут: Регулярные выражения.


Мануал, конечно, хорошая литература, но тяжеловата. За ссылку спасибо, почитаю.

Цитата: alekciy
А регулярка долна быть в духе:


Этот шаблон подходит по всем условиям: m/^[0-1]?[[0-9]:[0-5][0-9][am|pm]{2}/i !

Всем спасибо!

12
16 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Eklmn

Этот шаблон подходит по всем условиям: m/^[0-1]?[[0-9]:[0-5][0-9][am|pm]{2}/i !


Странный шаблон в контексте PHP... но видимо на Perl он катит...

20K
16 сентября 2007 года
Eklmn
19 / / 07.02.2007
Цитата: alekciy
Странный шаблон в контексте PHP... но видимо на Perl он катит...


Проверял и на php и на perl - работает везде. Признаться честно самому странным кажется. Хотя, скорее всего ещё не до конца понял правила использования специальных символов.

12
17 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Eklmn
Проверял и на php и на perl - работает везде.


Странный тогда у тебя PHP. У меня 5.2 ругается на модификатор m проставленный в начале выражения:

Цитата:

Warning: preg_match() [function.preg-match.html]: Delimiter must not be alphanumeric or backslash in H:\web\test\test_script1.php on line 3


Если поставить вконце то все ок.

А смысла в открытии символьного класса и не закрытие я вообще не понял.
/^[0-1]?[COLOR="Red"][[/COLOR][0-9]:[0-5][0-9][am|pm]{2}/im
В остально же практически тот же шаблон, что я уже писал.

2
17 сентября 2007 года
squirL
5.6K / / 13.08.2003
все это классно ребята. только ваш регексп допускает, к примеру 19:00 ;) а это НЕ удовлетворяет условию. топикстартер - перечитай собственное название топика и подумай почему. я предлагаю такой вариант:
 
Код:
/(1[012]|[1-9]):[0-5][0-9]?(am|pm)/i


а хорошая книга по регулярным выражениям есть. называется она "Регулярные выражения. Библиотека программиста". Написана - Джеффри Фриделем. Это лучшая существующая книга по регекспам. Ценность ее еще и в том, что она не привязана к языку.
12
17 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: squirL
все это классно ребята. только ваш регексп допускает, к примеру 19:00 ;)


Уверен? Мне скрипт вот что написал:

Цитата:

Строка 19:00 НЕ проходит

2
17 сентября 2007 года
squirL
5.6K / / 13.08.2003
уверен. 19:00 и не пройдет. она по условию не должна проходить. а вот 19:00am - пройдет.

словами запиши то, что написал:

[0-1]?[0-9]:[0-5][0-9](am|pm)

0 или 1 или ничего, затем цифра от 0 до 9, затем двоеточие, затем цифра от 0 до 5, затем цифра от 0 до 9, после чего либо am либо pm.

19:00am - подходит. условию задачи такое решение не удовлетворяет.
12
17 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: squirL
а вот 19:00am - пройдет.


Ах вот ты очем.. так и для твоей регулярки пройдет.

2
17 сентября 2007 года
squirL
5.6K / / 13.08.2003
ну да, ты прав, пройдет :) я думал что заключение регулярки в ^$ или \b \b для данного случая очевидно и опустил этот момент, для простоты. виноват. выражения
 
Код:
/\b(1[012]|[1-9]):[0-5][0-9]?(am|pm)\b/i

либо
 
Код:
/^(1[012]|[1-9]):[0-5][0-9]?(am|pm)$/i

в зависимости от ситуации, будут более правильными вариантами.
в любом случае - 19:00am в моем случае совпадало не потому, что регулярка совпадает с неправильным куском текста, как в твоем случае. совпадение происходит с 9:00am.
20K
17 сентября 2007 года
Eklmn
19 / / 07.02.2007
Цитата: alekciy
Странный тогда у тебя PHP. У меня 5.2 ругается на модификатор m проставленный в начале выражения:


У меня версия 4.4 ипсользую PHP Expert Editor - ошибок нет.

Цитата: alekciy
А смысла в открытии символьного класса и не закрытие я вообще не понял.
/^[0-1]?[COLOR="Red"][[/COLOR][0-9]:[0-5][0-9][am|pm]{2}/im
В остально же практически тот же шаблон, что я уже писал.


Извиняюсь, опечатка. :-)
Это он и есть.

Цитата: squirL
все это классно ребята. только ваш регексп допускает, к примеру 19:00 а это НЕ удовлетворяет условию. топикстартер - перечитай собственное название топика и подумай почему. я предлагаю такой вариант:


Просто упустил. :-) Спасибо за уточнение столь важного момента.

Цитата: squirL
а хорошая книга по регулярным выражениям есть. называется она "Регулярные выражения. Библиотека программиста". Написана - Джеффри Фриделем. Это лучшая существующая книга по регекспам. Ценность ее еще и в том, что она не привязана к языку.


Спасибо. Уже просматриваю.

Цитата: squirL
/\b(1[012]|[1-9]):[0-5][0-9]?(am|pm)\b/i


Только символ "?" в данном шаблоне, по-моему, лишний. Опечатка?

2
17 сентября 2007 года
squirL
5.6K / / 13.08.2003
ну почему лишний. последняя цифра в американском формате может и не указываться. хотя это уже как угодно - можно и убрать.
12
18 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: squirL

в зависимости от ситуации, будут более правильными вариантами.


03:00am не продет, хотя и должен. Сдается мне что тут шаблон-утверждение нужно использовать. И окончательно правильный шаблон будет:

 
Код:
/^(0[0-9](?=:)|[0-9](?=:)|1[012]):[0-5][0-9]?(am|pm)/i
2
18 сентября 2007 года
squirL
5.6K / / 13.08.2003
ведущий 0 - опционально. если надо - добавь

[LEFT]/\b(1[012]|0?[1-9]):[0-5][0-9]?(am|pm)\b/i

плюс - в этом варианте не прокатит 00:00. можно изменить так:

[LEFT]/\b(1[012]|0?[1-9]|00?):[0-5][0-9]?(am|pm)\b/i

можно еще подрихтовать, чтобы 00:00 выводилось без am/pm (ибо тупо :) )[/LEFT]
[/LEFT]
20K
18 сентября 2007 года
Eklmn
19 / / 07.02.2007
Цитата: squirL
последняя цифра в американском формате может и не указываться.


Понятно, не знал.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог