2014-09-23 3 views
0

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

Некоторые достоверные данные:

[0]: "1-9" 
[1]: "1" 
[2]: "1-9,1" 
[3]: "1,1-9,2,1-8" 

Было бы очень легко в EBNF:

validation = (number) | (number, '-', number), ',', validation ; 
number = digit, { digit } ; 
digit = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 ; 

Но регулярное выражение не такой же подход, как делает EBNF. Я читал о рекурсивных регулярных выражениях, но я все еще смущен ими. Моя текущая нерекурсивна попытка, которая проверяет 1/1 каждую запятую расщепляется допустимого значение:

/([0-9]*)|(([0-9]*)-([0-9]*))/g 

Таким образом, я могу подтверждено каждую запись по отдельности, но выяснить способ проверить все содержимое.

временное решение А:

pattern = /([0-9]*)|(([0-9]*)-([0-9]*))/g 
fields = fieldValues.split(',') 

И я создавал массив, содержащий истинным или ложным, чтобы знать, если выражение соответствует. Не могу ли я сделать все это в регулярном выражении, без JavaScript?

+0

Это регулярное выражение не является рекурсивным. – Unihedron

+0

Каков ваш ожидаемый результат? – ohaal

+0

Результат должен быть просто логическим значением. ИСТИННО || ЛОЖНЫЙ. –

ответ

3

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

> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1"); 
true 
> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1,"); 
false 
> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1-1"); 
true 
2

Используйте это регулярное выражение:

/^\d+(?:(?:-\d+(?:,\d+)?)*|(?:,\d+(?:-\d+)?)*)$/ 

Вот объяснение:

  • ^ и $ утверждает начало и конец матча.
  • (?:) группа имеет | чередование, чтобы соответствовать либо:
  • \d+ (по желанию -\d+ дополнительный ,\d+) один раз или более, или;
  • \d+ (факультативно ,\d+ опционально -\d+) один или несколько экземпляров.

Адрес regex demo.

1

о чем?

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

Или с \ д класса символов сокращенной записи:

(\d+|(\d+-\d+))(,(\d+|(\d+-\d+)))* 

Пояснение:

Это основной узор

(\d+|(\d+-\d+)) 

необязательно с последующим (ноль или более раз) по символу "," и по той же схеме.Следовательно:

(,(\d+|(\d+-\d+)))*