Регулярное выражение С# для соответствия квадратным скобкам

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

  • 2-значный номер
  • 1- или 2-значное число (не начинающееся с 0)
  • другое 1- или 2-значное число (не начинающееся с 0)
  • 1-, 2-, 3-, 4- или 5-значное число (не начиная с 0)
  • буква варианта в конце, заключенная в квадратные скобки.

Несколько примеров:

10.1.23.26812
83.33.7.5
10.1.23.26812[d]
83.33.7.5[q]

Неверные примеры:

10.1.23.26812[
83.33.7.5]
10.1.23.26812[d
83.33.7.5q

Я пробовал следующее:

string rex = @"[0-9][0-9][.][1-9]([0-9])?[.][1-9]([0-9])?[.][1-9]([0-9])?([0-9])?([0-9])?([0-9])?([[][a-zA-Z][]])?";

(примечание: если я попробую без «@» и просто выйду из квадратных скобок, выполнив «\[», я получу сообщение об ошибке «Нераспознанная escape-последовательность»)

Я могу добраться до точки, где номер версии проверяется правильно, но он принимает все, что идет после (например, «10.1.23.26812thisShouldBeWrong» сопоставляется как правильное).

Итак, мой вопрос: есть ли способ использовать регулярное выражение для сопоставления/проверки квадратных скобок в строке или мне нужно преобразовать его в другой символ (например: изменить [a] на a и вместо этого сопоставить *s)?


person TimCross    schedule 21.06.2013    source источник
comment
Соответствует ли это всей строке или этот номер версии находится в середине предложения?   -  person Bob Vale    schedule 21.06.2013


Ответы (2)


Это происходит из-за того, что регулярное выражение соответствует части строки, а вы не указали ему принудительное соответствие всей строки. Кроме того, вы можете значительно упростить регулярное выражение (например, вам не нужны все эти группы захвата< /а>:

string rex = @"^[0-9]{2}\.[1-9][0-9]?\.[1-9][0-9]?\.[1-9][0-9]{0,4}(?:\[[a-zA-Z]\])?$";

^ и $ – это якоря, соответствующие началу и концу строки.

Упомянутое вами сообщение об ошибке связано с тем, что вам также нужно избегать обратной косой черты, если вы не используете дословную строку. Таким образом, буквальная открывающая скобка может быть сопоставлена ​​в регулярном выражении как "[[]" или "\\[" или @"\[". Последняя форма является предпочтительной.

person Tim Pietzcker    schedule 21.06.2013

Вам нужно привязать регулярное выражение к ^ и $

string rex = @"^[0-9][0-9][.][1-9]([0-9])?[.][1-9]([0-9])?[.][1-9]([0-9])?([0-9])?([0-9])?([0-9])?([[][a-zA-Z][]])?$";

причина совпадения 10.1.23.26812thisShouldBeWrong в том, что оно соответствует подстроке 10.1.23.26812

Регулярное выражение можно немного упростить для удобства чтения.

string rex = @"^\d{2}\.([1-9]\d?\.){2}[1-9]\d{0,4}(\[[a-zA-Z]\])?$";

В ответ на предупреждение TimCross - обновлено регулярное выражение

string rex = @"^[0-9]{2}\.([1-9][0-9]?\.){2}[1-9][0-9]{0,4}(\[[a-zA-Z]\])?$";
person Bob Vale    schedule 21.06.2013
comment
Осторожно, в .NET \d эквивалентно \p{Nd} и поэтому также будет соответствовать "١٢٣" и другим числам, если только вы не скомпилируете регулярное выражение с RegexOptions.ECMAScript. - person Tim Pietzcker; 21.06.2013