2010-11-30 2 views
4

Я хочу написать регулярное выражение, которое соответствует списку числовых значений, заданных в списке с разделителями-запятыми, допустимыми диапазонами. Пустой не допускается.Регулярное выражение для диапазонов значений в списке, разделенном запятыми

Что-то вроде: 1-10,20-56,8,7

До сих пор у меня есть (([0-9] +) | ([0-9] + - [0-9] +),) * [0-9] +. Это делает большую часть работы, за исключением того, что она пропускает случай только одного диапазона (например: 1-10 не проверяет).

Проверка каждого диапазона может быть пропущена (например: допустимый диапазон может быть разрешен 20-10).

Любая помощь будет оценена по достоинству.

ответ

1

Что вы после один (номер или диапазон), необязательно с последующим нулем или более: запятая плюс (номер или диапазон):

(?:\d+(?:-\d+)?)(?:,(?:\d+(-\d+)?))* 

Это использует \d ярлык для [0-9] и Конструкция круглых скобок, не содержащихся в скобках, составляет (?: ...).

Это регулярное выражение не позволяет включать пробелы в список. Для того, чтобы позволить тем, вставить «дополнительное пространство» \s* между каждым термином:

\s*(?:\d+(\s*-\s*\d+)?)\s*(?:,\s*(?:\d+(\s*-\s*\d+)?)\s*)* 
0

Позволяет сказать, что сердцевина вашей скороговорки является

([0-9]+.)|([0-9]+-[0-9]+) 

Это соответствует одно числовому значению или диапазон. Итак, что вам нужно:

(CORE,)*CORE 

А что у вас есть:

(CORE,)*DIGIT 

Делай так, и вы будете хорошо:

(([0-9]+.)|([0-9]+-[0-9]+),)*([0-9]+.)|([0-9]+-[0-9]+) 
6

Вы можете использовать регулярное выражение;

^([0-9]+(-[0-9]+)?)(,([0-9]+(-[0-9]+)?))*$ 

Regex in action

+0

моей версия:^([0-9] +) (- [0-9] +) * (([0-9] +) (- [0 -9] +) *) * $. Это более или менее одинаково :) – poh 2010-11-30 04:33:06

0

Я думаю, что вы искали это:

(CORE)(,\s+CORE)* 

Это позволит списки, которые:

CORE CORE, CORE CORE, CORE CORE , CORE, CORE

и так далее.

Надеется, что это помогает,
Дэвид

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