2011-01-10 4 views
0

Помогите мне с регулярными выражениями. Мне нужно проверить текст на час и минуту. Это первый случай, текст может быть от 0 до 12. Во втором случае, текст может быть от 1 до 60.javascript регулярные выражения

это мой код:

var hourRegEx = /^([0-9]{2})$/; //You can fix this line of code? 

$(document).ready(
    function(){ 
    $('form.form').submit(function(){ 
    if($('input.hour').val().match(hourRegEx)){ 
     return true; 
    } 
    return false; 
    }); 
}); 

В моем случае, код говорит, что, например, 52, правильный ответ

+2

Если вы живете в какой-то альтернативной реальности, часы могут быть только 0 до 11. – Jamiec

+0

я не знаю много о регулярных выражениях –

+2

или от 1 до 12 .... –

ответ

3

Я бы сделал это с parseInt и цифровой проверки:

var hour = parseInt($('input.hour').val(), 10); 
if((hour >= 0) && (hour <= 11)){ 
    return true; 
} 
+0

:-) Считаете ли вы, что это работает быстрее, чем регулярные выражения? –

+1

@ Жасулан Да, далеко, намного быстрее. [См. Jsperf test] (http://jsperf.com/parseint-vs-regex). – lonesomeday

+0

Вы правы, я сделал, спасибо. –

2

Использование: /^([0-9]|10|11|12)$/. Это достаточно короткий, и очень ясно :)

Edit: или, если @Jamiec правильно и вы ошибаетесь о цифрах, /^([0-9]|10|11)$/

Для минут, используйте: /^([0-9]|[1-5][0-9])$/.

Edit 2: ах ждать, от 1 до 60. Используйте это:

/^([1-9]|[1-5][0-9]|60)$/ 

и в течение нескольких часов 1-12, если вам это нужно:

/^([1-9]|10|11|12)$/ или /^([1-9]|1[0-2])$/

+0

Вы правы, но как насчет минут? –

1

В этом:

[1-9]|1[0-2] будет соответствовать часам (1 .. 12)

[1-9]|[1-5][0-9]|60 будет соответствовать минут (1 .. 60)

, если вы хотите, чтобы соответствовать 0 .. 11 и 0 .. 59 это сделать

[0-9]|1[0-1] будет соответствовать час (0 .. 11)

[0-9]|[1-5][0-9] будет соответствовать минут (0 .. 59)

, если вы хотите, чтобы соответствовать 00 .. 11 и 00 .. 59 это сделать

0[0-9]|10|11 будет соответствовать час (00 .. 11)

[0-5][0-9] будет соответствовать минут (00 .. 59)

+0

Ваш код верен. –

+0

Хотя это технически правильно (поэтому я не буду понижать), этот код ужасен. Как менеджер dev я бы уволил любого, кто использовал регулярные выражения, чтобы делать числовые сравнения – DanSingerman

+1

:) Я рад, что он не применился для работы с вами тогда :). Но, пожалуйста, обратите внимание, что я представил разные типы выражений, чтобы вызвать мысль, что они могут стать чрезвычайно сложными даже в простых случаях. Но, вообще говоря, я согласен с тобой. Вы должны использовать регулярное выражение для получения грубых данных с некоторого ввода и после этого выполнить еще одну проверку в треске. –

1

Регулярное выражение для проверки числа от 0 до 12 лет было бы вдоль линий ^([0-9]|1[012])$ и протокола: ^[1-9]|[2-5][0-9]$.

Я бы не рекомендовал его. Лично я бы использовал parseInt, чтобы получить значение как число. Вы можете проверить, что это действительный номер, потому что parseInt вернет NaN, если это не так. Затем вы можете выполнить проверку диапазона.

var hourVal = parseInt($('input.hour').val(),10), 
    minVal = parseInt($('input.minute').val(),10); 

if(hourVal && hourVal >=0 and hourVal <= 12){ 
    // hour valid 
} 

if(minVal && minVal >=1 and minVal <= 60){ 
    // min valid 
} 
2

Почему бы не преобразовать его в целое число и использовать <? Regex не является заменой целочисленной арифметики.

+0

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

3

Если то, что вы по своей сути делаете сравнение чисел вы действительно не должны использовать регулярное выражение

Я хотел бы сделать это:

var numericRegEx = /^[0-9]+$/; 

$(document).ready(
    function(){ 
    $('form.form').submit(function(){ 
     var hourVal = $('input.hour').val(); 
     if(hourVal.match(numericRegEx) && parseInt(hourVal) <= 11){ 
      return true; 
     } 
     return false; 
    }); 


}); 

Это может быть слишком сложным; если бы я делал это, я бы просто использовал parseInt, но исходный код возвращал false для значений, таких как «11blah», поэтому некоторые функции регулярных выражений по-прежнему используются для проверки всей цепочки как целого.

1

Это должен обрабатывать также случаи, когда пользователь вводит 00-09:

/^(0?[0-9]|1[0-2])$/ 
+1

в течение 24 часов, которые, очевидно, были бы следующими: /^ ([01]? [0-9] | 2 [0-4]) $/ – CAFxX

1

Использование регулярных выражений не является жизнеспособным для этого случая. Вместо этого вы должны сравнить целое число, потому что '1', '01', '001' также действительны.

я Recommand этого вида сниппета

val = parseInt($('input.hour').val()); 
if (val >= 0 && val <= 12) 
    // is valid ... 
+1

Чтобы быть справедливым, его исходный код вернет false для значений, таких как «12blah», тогда как это вернет true. Следовательно, почему в моем ответе есть еще регулярное выражение, чтобы проверить, что вся строка является целым числом. – DanSingerman

+0

Но 01 также является формой времени. –

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