RegEx String Validator - PullRequest
       2

RegEx String Validator

2 голосов
/ 21 декабря 2011

В моем приложении MVC3 на одном из объектов я сохраняю Дата рождения в виде строки .Зачем ?потому что мое приложение позволяет хранить дату рождения давно умерших людей, например.Сократ, Платон, Эпикур ... и т. Д., Насколько я знаю, класс DateTime не позволяет этого.

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

12 Feb 1809
Feb 1809
341
341 BCE
Oct 341 BCE
11 Mar 5 BCE

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

Я пытался часами, и не получалгде угодно: s

ОБНОВЛЕНИЕ В ОТВЕТЕ НА ПРЕДОСТАВЛЕННЫЕ ОТВЕТЫ: ​​

Большое спасибо, ребята, я бы хотел, чтобы вы были так же хороши, как и вы, в создании RegExes!Поскольку мое приложение с ASP.net MVC3, я хотел бы придерживаться класса .NET RegEx (для удобства).

luastoned ответ, кажется, работает !!Кажется, я не могу нарушить его логику со всеми тестовыми данными, которые я ему предоставил.

Хотя я могу также разрешить BC?потому что некоторые люди используют BC, а другие - BCE <это было бы возможно?И .. я прав, что регулярное выражение не может заменить BC до BCE?Я должен сделать это вручную через мой код C # правильно?RegEx будет просто соответствовать или нет .. правильно? </p>

ОБНОВЛЕНИЕ ВТОРОЕ:

Регулярное выражение M42, кажется, работает лучше.Я только что скопировал его и использовал в своем пользовательском валидаторе (код ссылки PasteBin ниже).

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Как насчет:

/^(?:\d+\s)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?(?:\s?\d+)(?:\sBCE)?$/

Вот скрипт на Perl с тестовыми примерами:

#!/usr/local/bin/perl 
use strict;
use warnings;
use Test::More;

my $re1 = qr/^(?:\d+\s)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?(?:\s?\d+)(?:\sBCE)?$/;
while(<DATA>) {
    chomp;
    if (/$re1/) {
        ok(1, "input = $_");
    } else {
        ok(0, "input = $_");
    }
}
done_testing;

__DATA__
12 Feb 1809
Feb 1809
341
341 BCE
Oct 341 BCE
11 Mar 5 BCE
12D09
1s909
A3 43 4 BCE
a 1
3F9

abc
BCE
123b456

выход:

# Looks like you failed 9 tests of 15.
ok 1 - input = 12 Feb 1809
ok 2 - input = Feb 1809
ok 3 - input = 341
ok 4 - input = 341 BCE
ok 5 - input = Oct 341 BCE
ok 6 - input = 11 Mar 5 BCE
not ok 7 - input = 12D09
not ok 8 - input = 1s909
not ok 9 - input = A3 43 4 BCE
not ok 10 - input = a 1
not ok 11 - input = 3F9
not ok 12 - input = 
not ok 13 - input = abc
not ok 14 - input = BCE
not ok 15 - input = 123b456
1 голос
/ 21 декабря 2011

это выглядит как самый странный Regex, который я когда-либо делал:

(\d+\s?)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?\s(\d+\s)?(BCE)?

Я понятия не имею, сколько ложных срабатываний пройдёт, хотя ..

Вы можете проверить образец на Regexr

0 голосов
/ 21 декабря 2011

Не совсем друг RegExr (и не зная ограничений регулярных выражений в MVC3), позвольте мне представить версию PHP с именованными захватами ( demo ):

(?:(?:(?P<date>\d{1,2})\s)?(?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))?(?:(?:^|\s)(?P<year>\d+))?(?:\s(?P<bce>BCE))?

Это основано на ответе @ luastoned .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...