2013-06-05 5 views
1

Я очень новичок в регулярных выражениях. Моя строка выглядит следующим образом:регулярное выражение целое слово узор

"6 years, 10 months, 1 days, 23 hours, 15 seconds" 

и в основном я likd, чтобы соответствовать каждый раздел времени и слов, поэтому результирующий массив из JavaScripts String.match выглядит следующим образом:

[0] = "6 years" 
[1] = "10 months" 
[2] = "1 days" 
[3] = "23 hours" 
[4] = "15 seconds" 

Вот что я «ве попытался

/(\d{0,}\s(years|months|hours|days|seconds))/ 

но это регулярное выражение тестер показывает, что я ловлю каждое из слов, а в моей обратной ссылки http://rubular.com/r/qkyFJrBCq8

/(\d{0,}\s\w*)\,{0}/ 

и когда я пытаюсь соответствовать запятой, он просто повсюду. http://rubular.com/r/PXoPHVibH0

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

Как всегда, Спасибо всем!

+0

Как насчет '([^,] +)', который создает группы вокруг символов без запятой. См. [Мой пример] (http://rubular.com/r/9L61XjMeGs). – ChrisP

ответ

7

Вы могли бы просто использовать split с гораздо более простым регулярным выражением для разделителей:

var str = '6 years, 10 months, 1 days, 23 hours, 15 seconds'; 
var result = str.split(/,\s*/g); 

,\s* регулярное выражение просто соответствует запятой, за которой следует любое число пробелов.

+0

Спасибо за тонну, я не знал, что вы можете разделить по регулярному выражению! –

0

Если вы действительно хотите совместить шаблон, у вас есть основная проблема с вашим регулярным выражением - это то, как помещаются скобки. Эта модель будет соответствовать одной комбинации номер-единицы:

/(\d+\s((years)|(months)|(hours)|(days)|(seconds)))/ 
+0

Это не устраняет проблему с круглыми скобками; на самом деле, это просто усложняет ситуацию. Теперь каждый результат совпадения будет выглядеть как «[» ## days »,« days », undefined, undefined, undefined,« days », undefined]'. – cHao

+1

Ну, дело в том, что вы не должны делать это полностью с регулярным выражением. Большинство языков имеют функцию match_all или аналогичную в своем модуле regex, которая вернет массив объектов соответствия. Идея - это первый элемент - целевое совпадение. –

+0

См. [Мой ответ] (http://stackoverflow.com/a/16952520/1497596), который демонстрирует использование переключателя 'g' для достижения ** глобального соответствия **. – DavidRR

3

ответ Paulpro, кажется лучшим здесь, но не-захватывая Скобки(?: также должны работать для вас:

/(\d+\s(?:years|months|hours|days|seconds))/ 
+0

Спасибо за это, я не был уверен, как это сделать, и я знаю, что это будет нечто, что я снова увижу в будущем –

2

как насчет вы используете функцию split?

для регулярных выражений вы можете просто использовать этот шаблон:

/[0-9]+\s*[a-z]/i 
+0

Я предполагаю, что он не хочет, чтобы он соответствовал «10 голубей» , – cHao

+0

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

0

За этой answer on SO используйте g флаг с регулярным выражением, чтобы сделать глобального матч. Результаты возвращаются удобно в массиве:

var re = /(\d+\s(?:years|months|hours|days|seconds))/g; 
var str = "6 years, 10 months, 1 days, 23 hours, 15 seconds"; 
var myArray = str.match(re); 
alert(myArray); 

Обратите внимание, что exec возвращает один матч в то время, в то время как match возвращает все матчи сразу в массиве.

См. live demo here.

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