2009-12-06 2 views
2

Я пробовал:Что регулярное выражение соответствует этой схеме: 22-ноября-09

/^([0-3][0-9])-(A-Za-z)-([0-1][0-9])?$/ 

и я, не имея успеха. Что я делаю не так?

Спасибо вам, ребята!

+1

Вам нужно регулярное выражение, чтобы проверить, является ли дата действительной датой? В этом случае я бы воздержался от таких регулярных выражений, они также соответствуют 39-OTZ-03, что, вероятно, не то, что вы хотите. –

+0

Я абсолютно согласен с тобой - дело в том, что я не проверяю ввод пользователя, я уверен, что при анализе импорта CSV у меня нет проблемы с смещением столбцов. Это единственный столбец в таком формате, и ответ fastcodejava работает как шарм! – Drew

ответ

4
/^([0-3][0-9])-([A-Z]{3})-([0-1][0-9])$/ 

EDIT: /^(0[1-9]|[1-2][0-9]|3[0-1])-([A-Z]{3})-(0[1-9]|1[0-9])$/

+3

Вы должны сказать, что ОП делал неправильно ... – bobbymcr

1

Классы символов должны быть представлены квадратными скобками.

/^([0-3][0-9])-([A-Za-z]+)-([0-1][0-9])?$/ 
0

Отбросьте ?. И вы можете опустить скобки, если вы не тянете подстроки матчи:

/^([0-3][0-9])-([A-Z][A-Z][A-Z])-([0-1][0-9])$/ 

или

/^[0-3][0-9]-[A-Z][A-Z][A-Z]-[0-1][0-9]$/ 
3

Чтобы быть слишком педантичным, это регулярное выражение соответствует его: 22-NOV-09.

Если вы хотите вместо этого проверить, соответствует ли данная строка дате проверки в определенном формате, я бы рекомендовал использовать что-то вроде strptime. Например:

#define _XOPEN_SOURCE 
#include <time.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    struct tm tm; 
    char *p; 

    p = strptime(argv[1], "%d-%b-%y", &tm); 
    if (p && *p == '\0') { 
     printf("Matches\n"); 
     return 0; 
    } 
    else { 
     printf("Didn't match\n"); 
     return 1; 
    } 
} 

Python имеет datetime.datetime.strptime и Perl имеет POSIX::strptime. Я уверен, что большинство других языков имеют доступ к этой функции.

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