2013-02-08 3 views
1

Я не могу для жизни меня, похоже, выяснить, как установить регулярное выражение элемента с форматированием.регулярное выражение номера и буквы javascript

1d 5h 6m 12s 

А также позволяют ей иметь какие-либо изменения такие, как

1d 

1d 1h 

1d 1h 1m 

1d 1s 

6m 12s 

etc... 

Возможно ли с помощью регулярных выражений, чтобы сделать это мозоль форматирования?

+5

Что именно вы пытаетесь достичь? Регулярные выражения не имеют большого отношения к форматированию. –

+1

Вы пытаетесь разобрать этот тип значения для действительных временных рядов? Или пытаться превратить его во что-то? Какова цель. –

+0

Отправная точка для ответа: «^ (\ d + d)?? (\ D + h)?? (\ D + m)?? (\ D + s)??". Дайте нам знать, почему это недостаточно. – cmonkey

ответ

4

Предполагая, что вам нужно, чтобы это было для того,

if (/^\s*(?:(?:[1-9]\d*|0)d\s+)?(?:(?:1?\d|2[0-3])h\s+)?(?:[1-5]?\dm\s+)?(?:[1-5]?\ds)?\s*$/.test(str)) 
{ 
    // success 
} 

Вот быстрый распад:

  1. ^ и $ известны как якорей. Они соответствуют началу и концу строки, поэтому вы сопоставляете всю строку, а не только часть, , например.hello, world! 1d 5h 6m 12s будет проходить иначе.

  2. \s* и \s+ соответствует нулю или более, и одному или нескольким символам пробела.

  3. (?:[1-9]\d*|0) соответствует произвольному количеству цифр, но не одному, начинающемуся с нуля, если только он не равен нулю.

  4. (?:1?\d|2[0-3]) соответствует цифрам от 0 до 23 включительно.

  5. [1-5]?\d соответствует цифрам от 0 до 59 включительно.

  6. (?: ...) известны как группы, не участвующие в зачете. Они похожи на круглые скобки (для группировки), за исключением того, что простые совпадающие скобки захватывают, и нам здесь это не нужно.

  7. ? означает, что предыдущий объект не является обязательным.

+0

благодарит вас! это буквально отлично работает – kevindstanley

+0

Обратите внимание, что это будет соответствовать новостям и вкладкам. – Matthew

+2

Используйте 'test()' not 'match()', если вы хотите только логический результат – Bergi

0

Чтобы дать вам отправную точку:

(\d+d){0,1} //days - not checking for a max 

(((([0-1]){0,1}\d)|(2[0-4]))h){0,1} // 24 hours 

(((([0-5]){0,1}[0-9])|(60))m){0,1} //60 minutes 

(((([0-5]){0,1}[0-9])|(60))s){0,1} //60 seconds 

Затем положить их все вместе (в данном случае, не заботясь о количестве пробелов)

(\d+d){0,1}[ ]*(((([0-1]){0,1}\d)|(2[0-4]))h){0,1}[ ]*(((([0-5]){0,1}[0-9])|(60))m){0,1}[ ]*(((([0-5]){0,1}[0-9])|(60))s){0,1}[ ]* 

Включая @nhahtdh «ы улучшенный версию выше из комментариев. Благодаря!

((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? * 
+0

Слишком много групп захвата. Вам нужны все они? – nhahtdh

+0

Я вижу один лишний (фиксированный). Я думаю, что остальные нужны для подхода, который я взял. Я стремился к чтению regex-newbie. Возможно, не удалось :) – Matthew

+1

'((\ d +) d)? * (([01] \ d |? 2 [0-4]) ч)? * (([0-5] \ д |? 60) м)? * (([0-5] \ д |? 60) с)? * '- упрощено из вашего регулярного выражения. Не как «regex-newbie-friendly» (без сарказма), как ваш. – nhahtdh

0

Я думаю, что это то, что вы хотите:

function parse(s) { 
y = s.match(/(?:(\d+)d\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s)?/); 
console.log(y); 
return y; 
} 

Вот как это работает:

  • (\d+)d\s* соответствует несколько цифр, за которыми следует d, с последующим дополнительным пробельных
  • оберточной он в (?:...)?, как (?:(\d+)d\s*)? делает вышеуказанное опционным. ?: заставляет новый набор круглых скобок не быть группой захвата.
  • повторить для h, m и s, и все готово.
Смежные вопросы