Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Регулярные выражения


Автор: study 9.12.2004, 12:28
Народ, подскажите мне как проверить ввод пользователя. Строка может содержать только цифры от 0 до 9, символ пробела, символ ':' и символ '-'.

Заранее спасибо!!!

Автор: Phoinix 9.12.2004, 12:37
study

~ /^[\d\s\:\-]+$/;

Автор: GoodBoy 9.12.2004, 12:40
$var =~ /^[0-9 :-]+$/;

Автор: study 9.12.2004, 12:42
Спасибо, сейчас попробую.

Автор: chaos 9.12.2004, 12:42
Цитата(study @ 9.12.2004, 12:28)
Народ, подскажите мне как проверить ввод пользователя. Строка может содержать только цифры от 0 до 9, символ пробела, символ ':' и символ '-'.

Заранее спасибо!!!

Сколько может быть пробелов, :,- ???
и приведи пример

Автор: GoodBoy 9.12.2004, 12:45
Цитата(chaos @ 9.12.2004, 12:42)
Сколько может быть пробелов

а какая разница?

Автор: study 9.12.2004, 13:17
Я правильно проверяю? А пример 2004-12-06 14:09:47, но времени может и не быть...

Код

if ($var =~ /^[0-9 :-]+$/){
print "не подходит";
}

Автор: chaos 9.12.2004, 13:31
Цитата(study @ 9.12.2004, 13:17)
Я правильно проверяю? А пример 2004-12-06 14:09:47, но времени может и не быть...

Код

if ($var =~ /^[0-9 :-]+$/){
print "не подходит";
}

А пример 2004-12-06 14:09:47
я бы проверял так:
Код

$str = '2004-12-06 14:09:47';
if ($str =~ m/\d{4}-0[1-9]|1[0-2]-0[1-9]|1[0-9]|2[0-9]|3[0-1] (0[0-9]|1[0-9]|2[0-4]:...

и так далее

Автор: korob2001 9.12.2004, 13:32
Код

#!/usr/bin/perl -w
use strict;
my $var = "2004-12-06";
if ($var =~ /^\d{4}-\d{2}-\d{2}(?:\s+\d+:\d{2}:\d{2})?$/){
  print "Подходит";
} else {
  print "Не подходит";
}

Автор: chaos 9.12.2004, 13:35
Цитата(korob2001 @ 9.12.2004, 13:32)
Код

#!/usr/bin/perl -w
use strict;
my $var = "2004-12-06";
if ($var =~ /^\d{4}-\d{2}-\d{2}(?:\s+\d+:\d{2}:\d{2})?$/){
  print "Подходит";
} else {
  print "Не подходит";
}

а если будет вот такая хрень: 2004-43-32
это же не дата а п воему шаблону всебудет хорошо

Автор: korob2001 9.12.2004, 13:39
Цитата

а если будет вот такая хрень: 2004-43-32
это же не дата а п воему шаблону всебудет хорошо

А для этого, нужно узнать, стоит-ли вообще делать такую проверку. ;))) Потому как за каждое уточнение прийдётся платить производительностью.

Автор: chaos 9.12.2004, 13:50
Цитата(korob2001 @ 9.12.2004, 13:39)
Цитата

а если будет вот такая хрень: 2004-43-32
это же не дата а п воему шаблону всебудет хорошо

А для этого, нужно узнать, стоит-ли вообще делать такую проверку. ;))) Потому как за каждое уточнение прийдётся платить производительностью.

если задача стоит проверить правельность даты то нужно делать такие проверки
иначе нет смысла тк твой шаблон проверяет только на порядок и кол-во цифр

Автор: study 9.12.2004, 14:07
chaos, можешь дать кусок готового кода? Pls....

Автор: chaos 9.12.2004, 14:22
Цитата(study @ 9.12.2004, 14:07)
chaos, можешь дать кусок готового кода? Pls....

Вот тебе пример, вроде все работает
Код

$str='2994-10-12 22:12:65';

if ($str =~ m/(2\d{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-9]|3[01])/) {
 print "data ok";
 
 if ($str =~ m/\d{4}-\d{2}-\d{2}\s([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/) {
   print "time ok";
 }
 else {print "  time error";}

}
else {print "data error";}


ps Инересны ваши замечания

Автор: chaos 9.12.2004, 16:57
Цитата(study @ 9.12.2004, 13:17)
Я правильно проверяю? А пример 2004-12-06 14:09:47, но времени может и не быть...

Код

if ($var =~ /^[0-9 :-]+$/){
print "не подходит";
}

Вот этим ты вообще не понятно что пытался сделать:
Код

if ($var =~ /^[0-9 :-]+$/){
print "не подходит";
}

Автор: dimes 9.12.2004, 17:58
Цитата(chaos @ 9.12.2004, 14:50)
если задача стоит проверить правельность даты то нужно делать такие проверки
иначе нет смысла тк твой шаблон проверяет только на порядок и кол-во цифр

Да?
А если будет так : 2004-11-31 или 2003-02-29 ?
Коректность даты регуляркой проверить нельзя только порядок и кол-во цифр

Автор: korob2001 9.12.2004, 20:36
Цитата

Вот этим ты вообще не понятно что пытался сделать:

Думаю что этим он пытался ответить на этот вопрос:

Народ, подскажите мне как проверить ввод пользователя. Строка может содержать только цифры от 0 до 9, символ пробела, символ ':' и символ '-'.
Заранее спасибо!!!


Как видишь, здесь вообще ничего не сказано, по поводу даты и времени.

Цитата

Вот тебе пример, вроде все работает

Код 

$str='2994-10-12 22:12:65';

if ($str =~ m/(2\d{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-9]|3[01])/) {
print "data ok";

if ($str =~ m/\d{4}-\d{2}-\d{2}\s([01][0-9]|2[0-3])smile[0-5][0-9])smile[0-5][0-9])/) {
  print "time ok";
}
else {print "  time error";}

}
else {print "data error";}




ps Инересны ваши замечания

Да, ты совсем не экономишь ресурсы.
1.) Почему же ты не проверяешь год?
2.) Используя в регулярных выражениях символ "|", ты нагружаешь систему. А у тебя он встречается сколько раз?
3.) Круглых скобок понаставил, а переменные $1, $2 и т.д. не используешь. ( а это, драгоценная, память ;))) ).

Вобщем если есть у тебя книга "Perl - Библиотека программиста", открой станицу 104 и почитай о том, как парсит дату Том Кристиансен. Давай не будем считать его за лоха, чел можно сказать жизнь посвятил языку Perl.

Удачи.

Автор: chaos 10.12.2004, 14:22
Хорошо!!! Я принел во внимания Ваши замечания, действительно конструкция моя нагружена ненужными элементами, но сдругой стороны это как ни как пример, а тот кто им будет пользоваться может как ему нужно его изменить!!!

Вот еще один примерчик набросал:
Код

use English;
use Time::Local;

$date='2004-12-31 23:00:60';
($yyyy, $mm, $dd,$t, $hh24, $mi, $ss) = ($date =~ /(\d+)-(\d+)-(\d+)(\s(\d{2}):(\d{2}):(\d{2}))?/);
eval {timelocal($ss, $mi, $hh24, $dd, $mm-1, $yyyy)};
if ($EVAL_ERROR eq '') {print "ok";}
else {print "error";}


ps Также интересны ваши замечания
Добавлено @ 14:29
Цитата(dimes @ 9.12.2004, 17:58)
Цитата(chaos @ 9.12.2004, )
если задача стоит проверить правельность даты то нужно делать такие проверки
иначе нет смысла тк твой шаблон проверяет только на порядок и кол-во цифр

Да?
А если будет так : 2004-11-31 или 2003-02-29 ?
Коректность даты регуляркой проверить нельзя только порядок и кол-во цифр

ты прав!
новое решение см. выше

Автор: Phoinix 10.12.2004, 18:54
chaos

Вот это:
Код

($yyyy, $mm, $dd,$t, $hh24, $mi, $ss) = ($date =~ /(\d+)-(\d+)-(\d+)(\s(\d{2}):(\d{2}):(\d{2}))?/);


Заменить на:
Код

($yyyy, $mm, $dd, $hh24, $mi, $ss) = split /[\-\s\:]/,$date;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)