2014-01-29 4 views
0

Я пытаюсь написать регулярное выражение, которое позволит вводить время в минутах, секундах, десятых & сотых. Проблема заключается в том, что пользователю также должно быть разрешено вводить время всего за несколько секунд & десятых или секунд, десятых & сотых. Изменения, как это:Выражение выражения для разрешения MM: SS, TH или SS, TH

мм: сс-й м: сс: й мм: S: т

Вы получаете картину.

Следующие варианты: s | ss: t | s: th | s: т

^(([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])(\.|\,)([0-9]|[0-9][0-9]))$

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

^(([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])(\.|\,)([0-9]|[0-9][0-9])) | (([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])(\.|\,)([0-9]|[0-9][0-9]))$

В конце концов, мне нужно добавить часы, а также позволяют пользователь вводит время в секундах более 59 - например 67.32s

+0

На каком языке? – EverythingRightPlace

+0

Вам нужно отдельно записывать минуты, секунды, десятки и сотые? –

+0

Язык не имеет значения. У меня есть (\. |,) Для решения десятичной проблемы. –

ответ

1

Там может быть неучтенные форматы следующих не распространяется :)

^(?:\d+:)?(?:[0-5]\d:|[0-9]:)?(?:[0-5]\d|\d)(?:[.,]\d\d?)?$ 

преуспевает и не для следующих целей:

9.45 - success 
9 - success 
4:6.65 - success 
5:06.65 - success 
5:6,65 - success 
50:40 - success 
50:40.65 - success 
50:06.65 - success 
50:06.6 - success 
06.65 - success 
6.65 - success 
1:50:06.65 - success 
19:50:06.65 - success 
19:50:06.65 - success 
69,45 - fail 
69.45 - fail 
19:60:06.65 - fail 
19:50:96.65 - fail 

Я печатаю объяснение в ближайшее время.

пересмотренный вариант - на основе замечаний OP в

^(?:\d+:)?(?:[0-5]\d:|[0-9]:)?(?:[0-5]\d|\d|^\d\d)(?:[.,]\d\d?)?$ 

Где предыдущие неудачные для 69,45|69.45 теперь соответствует. Я просто добавил в части секунды:

|^\d\d 

Конечно, это будет провал для 169,45, но просто изменить предыдущее дополнение к:

|^\d+ 

Теперь он будет соответствовать тому, что когда-либо количество секунд :)

+0

Спасибо за комментарий. Я пытался добавить еще один критерий, но он не работает. Должно быть возможно ввести время в секундах более 59,99, но только в том случае, если не задействованы часы. 1: 66.34 не следует допускать, но 66.34 следует. Это то, что я пробовал: '^ (: (: \ d +:) (: [0-5] \ д: |??? [0-9]:) (: [0-5] \ д | \ г) (?:? [?. ,] \ d \ d?)?) | (?: \ d \ d \ d [.,] \ d \ d)? $ ' –

+0

@CraigMorgan, пожалуйста, ch Повторное регулярное выражение – gwillie

1

Давайте придерживаться правовых ценностей сейчас (это всегда можно ослабить требования позже), и давайте использовать многословный регулярное выражение, надеясь ваше регулярное выражение вкуса поддерживает те:

^   # Start of string 
(?:  # Match the following non-capturing group: 
(  # Match (and capture into group 1): 
    \d{1,2} # one or two digits 
)   # End of group 1 
:   # Match a colon 
)?   # End of non-capturing group, make it optional. 
(   # Start of capturing group 2: 
[0-5]? # Match a number between 0 and 5 (optional) 
[0-9]  # Match a number between 0 and 9 (required) 
)   # End of group 2 
:   # Match a colon 
([0-9]) # Match and capture a number (0-9) in group 3 
(?:  # Match the following non-capturing group: 
([0-9]) # Match and capture a number in group 4 
)?   # End of non-capturing group (optional) 
$   # End of string 

Посмотри live on regex101.com.

Edit: JavaScript не поддерживает многословные регулярных выражений, так что вам нужно это:

/^(?:(\d{1,2}):)?([0-5]?[0-9]):([0-9])(?:([0-9]))?$/.test(subject) 

получить True/False, если ответ subject соответствует требованиям.

+0

ОК - это работает ... спасибо. Просто чтобы понять и расширить ваше решение, включив десятичные знаки и часы, не могли бы вы объяснить, что это значит - (?: # Совместить следующую группу, не связанную с захватом: –

+0

@CraigMorgan: '(?: ...) 'совпадает с' (...) 'с одной разницей: часть, согласованная содержимым группы, запоминается только для последующего повторного использования/извлечения последней. См. этот учебник по [(не) группам захвата] (http://www.regular-expressions.info/brackets.html) –

+0

Должно быть лучше, если '[0-9]' заменить на '\ d'. – Stephan

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