2013-12-09 3 views
2

Что было бы лучшим регулярным выражением в C# для проверки нижеследующего условия?Регулярное выражение для диапазона страниц

1, 2-10,5-10,6,9-100 - это что-то вроде номеров страниц, указанных как диапазон или отдельные, разделенные запятыми.

+0

Это «строка»? Если это так, вы можете использовать 'String.Split (',')' также .. –

+0

Требования кажутся неясными. Разрешаете ли вы отдельным страницам смешивать диапазоны, разделенные запятыми? –

+0

Игнорируя, что это для javascript, и проблема заключалась в том, чтобы ускользнуть от обратной косой черты, вот что я обнаружил в google для меня: http://stackoverflow.com/questions/4468336/javascript-regular-expression-page-range-validation – moritzpflaum

ответ

5

Попробуйте следующее выражение:

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

Обратите внимание, что модель является довольно хрупким, что он не допускает каких-либо пробелов, как есть.


Идея строится вокруг главного подмаски \d+(?:-\d+)?:

  1. \d+ - соответствует один или несколько последовательных цифр (либо автономно или в качестве левой границы диапазона)
  2. -\d+ - Совпадение знак минуса, за которым следуют одна или несколько цифр (граница правого диапазона)

Обратный знак вопроса делает знак минус d дополнительная граница диапазона (которая также должна совпадать с номерами одной страницы); (?:) обозначает non-capturing group.

+0

этоi безупречный. Благодаря! – user2325247

+0

@ user2325247 Рад, что я мог помочь. Пожалуйста, подумайте о принятии этого ответа, если он решит вашу проблему! –

0

Это регулярное выражение будет соответствовать каждому диапазону страниц по отдельности:

\d+-\d+|\d+

Я чередование для достижения этой цели. В случае, если \d+-\d+ (диапазон номеров страниц) не согласован, он просто будет соответствовать единственному, бесконечному числу \d+.

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

+0

Это регулярное выражение не позволяет использовать запятую между номерами по запросу. – DavidRR

+0

Он сказал «разделен запятыми». Если я сопоставляю запятые, диапазоны страниц не будут раздельными. Если ему нужен каждый диапазон страниц, который должен быть помечен запятой, он может использовать регулярное выражение: '\ d + - \ d +, | \ d +,' –

+0

Это будет соответствовать '1' или' 12' или '12,' или '12 -345, 'индивидуально. Моя интерпретация вопроса заключается в том, что OP хочет сопоставить ** последовательность ** разделенных запятыми отдельных номеров или диапазонов (например, «1,3-5,6,7-12') и определить, будет ли вся целая последовательность ** действует. – DavidRR

0

Когда я вырезать и вставить строку образца, я заметил, что пространство следует 1, в самом начале:

1, 2-10,5-10,6,9-100 
^

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

Это говорит, вот регулярное выражение, который будет соответствовать вашим требованиям:

^[0-9]+(?:(?:\s*,\s*|-)[0-9]+)*$ 
^^^^^^  ^^^^^^^^^^^^^^^
    A   B1 B2 C D 
      ^^^^^^^^^ 
       B 

A - One or more digits 
B1 - A comma with optional space characters on either side, *OR* 
B2 - A dash (without whitespace on either side) 
C - One or more digits 
D - Optionally repeat B and C 

Примечание:\d и [0-9]являются не эквивалент; предыдущие совпадения all Unicode digits. Я предположил, что вас интересуют только цифры 0 через 9.

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