Могу ли я сократить это регулярное выражение? - PullRequest
6 голосов
/ 19 августа 2010

Мне нужно проверить, соответствуют ли строки определенному формату идентификатора.

Формат идентификатора следующий:

aBcDe-fghIj-KLmno-pQRsT-uVWxy

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

У меня есть следующее регулярное выражение, которое работает:

string idFormat = "[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}";

Обратите внимание, что нет завершающей черты, новсе блоки внутри идентификатора имеют одинаковый формат.Поэтому я хотел бы иметь возможность представлять эту последовательность из четырех блоков с завершающей чертой внутри регулярного выражения и избегать дублирования.

Я пробовал следующее, но это не работает:

string idFormat = "[[a-zA-Z]{5}[-]{1}]{4}[a-zA-Z]{5}";

Как мне сократить это регулярное выражение и избавиться от дублированных частей?

Каков наилучший способ гарантировать, что каждый блок также не содержит чисел?


Редактировать:

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

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

Тест 1: aBcDe-fghIj-KLmno-pQRsT-uVWxy
Тест 2: abcde-fghij-klmno-pqrst-uvwxy

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

^([a-zA-Z]{5}-){4}[a-zA-Z]{5}$

Со следующим регулярным выражением testОшибка 1:

^([a-z]{5}-){4}[a-z]{5}$

В нескольких ответах говорилось, что нормально использовать AZ при использовании az, но это нормально, но в этом случае оно не работает.

Ответы [ 5 ]

7 голосов
/ 19 августа 2010

Вы можете попробовать:

([a-z]{5}-){4}[a-z]{5}

и сделать его без учета регистра.

6 голосов
/ 19 августа 2010

Если вы можете установить параметры регулярного выражения без учета регистра, вы можете заменить все [a-zA-Z] на просто [a-z].Кроме того, [-]{1} можно записать как -.

Ваша группировка должна выполняться с (, ), а не с [, ] (хотя вы правильно используетепоследний в определении наборов символов.

В зависимости от контекста, вы, вероятно, захотите добавить ^...$, который соответствует началу и концу строки, соответственно, чтобы убедиться, что строка whole соответствует(то есть, что нет никаких дополнительных символов).

В javascript, что-то вроде этого:

/^([a-z]{5}-){4}[a-z]{5}$/i
1 голос
/ 19 августа 2010

Это работает для меня, хотя вы можете проверить это:

[a-zA-Z]{5}(-[a-zA-Z]{5}){4}

(одна группа из пяти букв, за которой следуют [тире + группа из пяти букв] четыре раза)

0 голосов
/ 19 августа 2010
([a-zA-Z]{5}[-]{1}){4}[a-zA-Z]{5}
0 голосов
/ 19 августа 2010

Попробуйте

string idFormat = "([a-zA-Z]{5}[-]{1}){4}[a-zA-Z]{5}";

т.е. вы в основном заменяете скобки скобками. Скобки предназначены не для группировки, а для определения класса принятых символов.

Однако имейте в виду, что при сокращенных версиях вы можете использовать выражение для проверки строки, , но не для ее анализа. Если вы хотите обработать 5 групп символов, вам нужно поместить их в 5 групп:

string idFormat =
    "([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...