2012-07-30 3 views
0

Пытается подтвердить дату форматирования (YYYY_MM_DD). Когда тестовая переменная установлена ​​как 2012_4_123, после запуска скрипта будет напечатан «действительный формат». Он должен дать сообщение «неверная ошибка», потому что в регулярном выражении часть дня проверяется как минимум на 1 цифру и не более 2-х цифр. Не уверен, как печатать «допустимый формат» в качестве выходного сообщения.perl регулярные выражения с датой

my $test="2012_4_123"; 
if ($test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})/) 
{ 
    print "invalid format\n"; 
} 
else 
{ 
print "valid format\n"; 
} 
+2

Вы можете опустить круглые скобки в своем регулярном выражении, если вы не используете захваты позже в своем скрипте. – Kenosis

ответ

1
-if ($test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})/) 
+if ($test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})$/) 
1

Вы пропускаете $ в конце. это соответствует строке "2012_4_12", потому что вы не сказали ей, чтобы она соответствовала концу строки. Ваше регулярное выражение должно быть таким.

$test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})$/ 
1

Простое добавление $ решает исходную задачу позволяет более двух цифр в день, но вводит более тонкую ошибку: даты теперь будет проверять, несмотря на наличие новой строки в конце. Это может не иметь значения в зависимости от вашего приложения, но его можно избежать, используя регулярное выражение в следующем примере:

use strict; 
use warnings; 

my @tests = (
    '2012_4_123', 
    '2012_11_22', 
    "2012_11_22\n", 
); 

use Data::Dumper; 
print Dumper \@tests; 

foreach my $test (@tests) { 
    if ($test !~ m/\A(\d{4})_(\d{1,2})_(\d{1,2})\z/smx) 
    { 
     print "invalid format\n"; 
    } 
    else 
    { 
     print "valid format\n"; 
    } 
} 

Примечание: /smx рекомендовано Perl Best Practices и я пишу свои регулярные выражения с ним, если нет конкретная необходимость не иметь его, но он может вас тронуть, если вы к этому не привыкли.

/s и /m позволит вам легко обрабатывать многострочные строки; /s потому что . будет соответствовать новой строки и /m, чтобы позволить вам использовать ^ и $, чтобы соответствовать начало и конец строки соответственно, и \A и \z будет соответствовать начало и конец всей строки.

/x - просто разрешить пробелы и комментарии в регулярном выражении, хотя вам нужно избегать пробелов, если вы на самом деле пытаетесь их сопоставить.

В этом случае используется \z вместо $, что делает разницу независимо от использования /smx.

Кроме того, неплохо было бы взглянуть на модуль для проверки даты, а не только на проверку формата даты (опять же, в зависимости от того, для чего вы используете это). См. Это discussion on perlmonks.

+0

Возможно, вам стоит объяснить, что делают эти коммутаторы. – simbabque

+0

Да, не плохая идея, теперь добавлена. – edb

Смежные вопросы