2014-01-31 4 views
1

У меня есть регулярное выражение для «дд/мм/гггг», который прекрасно работает,Изменить регулярное выражение для «дд/мм/гггг»

"^([0]?[1-9]|[1][0-2])[./-]([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0-9]{4}|[0-9]{2})$" 

, но я хочу изменить это так оно и принимает 00/MM/2014. Моя программа интерпретирует это как все дни в конкретном месяце. Например, 00/04/201 означает все даты в апреле.

Может ли кто-нибудь сказать мне, какие изменения мне нужно сделать для создания сценария, чтобы это произошло?

Вот код, который я использую его в:

<asp:TextBox ID="TextBox5" runat="server" MaxLength="1" CssClass="MainContent" 
         style="text-align:justify" ValidationGroup="MKE" Width="130px" /> 
        <asp:ImageButton ID="ImgBntCalc" runat="server" CausesValidation="False" 
         ImageUrl="images\calendar-schedulehs.png" /> 
            <asp:MaskedEditExtender ID="MaskedEditExtender2" runat="server" 
             AcceptNegative="Left" DisplayMoney="Left" ErrorTooltipEnabled="True" 
             mask="99/99/9999" MaskType="Date" MessageValidatorTip="true" 
             OnFocusCssClass="MaskedEditFocus" OnInvalidCssClass="MaskedEditError" 
             TargetControlID="TextBox5" /> 
             <asp:MaskedEditValidator ID="MaskedEditValidator2" runat="server" 
             ControlExtender="MaskedEditExtender2" ControlToValidate="TextBox5" 
             Display="Dynamic" EmptyValueBlurredText="*" ValidationExpression="^(?:[012]?[0-9]|3[01])[./-](?:0?[1-9]|1[0-2])[./-](?:[0-9]{2}){1,2}$" 
             InvalidValueMessage="Date is invalid" ValidationGroup="MKE1" /> 
            <asp:CalendarExtender ID="CalendarExtender1" runat="server" Format="dd/MM/yyyy" 
             PopupButtonID="ImgBntCalc" TargetControlID="TextBox5" /> 
+0

Это регулярное выражение не будет работать на 'дд/ММ/yyyy' -' 31/01/2014' не пройдет. –

+0

Какие изменения я должен сделать, чтобы он принял также 31/01/2014? – user3033921

ответ

3

Ну сейчас он построен для MM/dd/yyyy (первая группа может содержать только 0-12). Но вот один, который работает для dd/mm/yyyy и позволяет 00 или 0 дня:

"^([0]?[0-9]|[12][0-9]|[3][01])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$" 
+0

Просто чтобы подтвердить, что просто переключение первых двух групп чисел вокруг так, чтобы оно было, как и раньше, кроме dd/MM вместо MM/dd? – Chris

+0

И добавление '00' в качестве действительного дня (сменил' [1-9] 'на' [0-9] 'в первой группе) –

+1

FYI, вы не хотите, чтобы труба внутри квадратных скобок; они означают чередование по определению (например, '[01]' правильно, а не '[0 | 1]', если вы не хотите принимать '|' как действительный символ даты!) – Ben

0

Вы также можете проверить DateTime.ParseExact (формат описан here), в большинстве случаев это простой способ разбора даты ..

+0

Это не синтаксический анализ дат, хотя вы не предполагаете, что OP должен проверять, пытаясь разобрать. В этом случае, хотя они были бы дальше от возможности принимать 00/MM, чем они есть сейчас ... Я бы предложил сделать это замечанием или расширить свой ответ, чтобы более четко решить проблему. – Chris

+0

Вы правы, я пропустил тот факт, что он не * описывал формат даты, а указывал литеральный ввод, который принимает его программа. – Astrotrain

0

Я бы сказал, что в этом выражении происходит слишком много. Субъективно, но если бы это был мой код, я бы сделал looseer regex и выполнил проверку в коде. Я нахожу, что легче вернуться шесть месяцев спустя и понять это, а не сложное регулярное выражение.

Это, как говорится ...

^(00|0?[1-9]|[12][0-9]|3[01])[./-]([0]?[1-9]|[12][0-9]|[3][01])[./-]([0-9]{4}|[0-9]{2})$ 

EDIT

В качестве объяснения, вот день часть выражения, прокомментировал:

^(
    00   # match the literal string '00' 
    | 0?[1-9] # or, match 1-9, optionally prefixed with '0' 
    | [12][0-9] # or, match days 10-29 
    | 3[01]  # or, match days 30 and 31 
) 

Судя по вашим комментариям , похоже, что существует проблема с тем, как вы используете регулярное выражение в коде. Можете ли вы опубликовать код, в котором вы действительно используете выражение?

+0

все еще не принимает 00/01/2014! – user3033921

+0

Эта строка проверяет для меня, на самом деле - я просто копировал/вставлял ее из своего ответа в код и запускал ее; '00/01/2014' успешно проходит. Что вы видите? Можете ли вы обновить свой ответ кодом, который у вас есть, который не принимает эту дату? – Ben

+0

Извините за задержку, я только что обновил выше код, который вы просили. Я заранее подхожу к вашей помощи. – user3033921

0

Как насчет:

дд/мм/гггг:

^(?:[012]?[0-9]|3[01])[./-](?:0?[1-9]|1[0-2])[./-](?:[0-9]{2}){1,2}$ 

дд/мм/гггг:

^(?:0?[1-9]|1[0-2])[./-](?:[012]?[0-9]|3[01])[./-](?:[0-9]{2}){1,2}$ 
+0

еще не принимает 00/01/2014! – user3033921

+0

@ user3033921: Да, это так, с первым 'dd/mm/yyyy'. – Toto

0

Try этот шаблон

^([0]?[0-9]|[1][0-2])[.\/-]([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0-9]{4}|[0-9]{2})$ 

В ASPX

<asp:TextBox ID="TextBox5" runat="server" MaxLength="1" CssClass="MainContent" 
          style="text-align:justify" ValidationGroup="MKE" Width="130px" /> 
         <asp:ImageButton ID="ImgBntCalc" runat="server" CausesValidation="False" 
          ImageUrl="images\calendar-schedulehs.png" /> 
             <asp:MaskedEditExtender ID="MaskedEditExtender2" runat="server" 
              AcceptNegative="Left" DisplayMoney="Left" ErrorTooltipEnabled="True" 
              mask="99/99/9999" MaskType="Date" MessageValidatorTip="true" 
              OnFocusCssClass="MaskedEditFocus" OnInvalidCssClass="MaskedEditError" 
              TargetControlID="TextBox5" /> 
              <asp:MaskedEditValidator ID="MaskedEditValidator2" runat="server" 
              ControlExtender="MaskedEditExtender2" ControlToValidate="TextBox5" 
              Display="Dynamic" EmptyValueBlurredText="*" ValidationExpression="^([0]?[0-9]|[1][0-2])[.\/-]([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0-9]{4}|[0-9]{2})$" 
              InvalidValueMessage="Date is invalid" ValidationGroup="MKE1" /> 
             <asp:CalendarExtender ID="CalendarExtender1" runat="server" Format="dd/MM/yyyy" 
              PopupButtonID="ImgBntCalc" 

    TargetControlID="TextBox5" /> 

ПРОВЕРЬТЕ ЗДЕСЬ DATE VALIDATION

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