2011-12-14 2 views
0

У меня есть сложное регулярное выражение, которое мне нужно реализовать, и я не большой парень RegEx.Регулярное выражение с разделителями и длиной

Правила:

2 буквенно-цифровых символов, сопровождаемые . или - затем 2 буквенно-цифровых символов.

Он не может быть пустым и не может иметь только одну пару (то есть 01). Строка может содержать до 10 наборов из 2 альфа-чисел. то есть 01.02.03.04.05.06.10, и разделитель, который был выбран, не может быть изменен. И выражение не может заканчиваться разделителем

Примеры:

Действительно:

a1.02.b3.00 
01-02-aa-04 
01.02 
aa.bb 
ac.21 

Invalid:

aa.01-02 
123.2.10 
01 
a1. 

Идеи?

+0

1. Какой аромат регулярного выражения? 2. Почему это нужно делать с помощью регулярного выражения? –

+3

Это звучит как домашнее задание ... – Giann

+0

@ Все ... Я использую модификатор [RegularExpression()] для свойства объекта MVC3 Model. Это здорово для пользователя, потому что валидация применяется везде, где используется свойство – MikeTWebb

ответ

3

EY, GUYS !?

Зачем делать вещи более сложными, чем они должны быть?

^[a-z0-9]{2}([.-])([a-z0-9]{2}\1){0,8}[a-z0-9]{2}$ 

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


Если вы пишете регулярное выражение, как /regular-expression/: Используйте /i в качестве модификатора (без учета регистра матч).

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


Объяснения частей разных в этом регулярном выражении

  • ^[a-z0-9]{2} строка должна начинаться с двумя символами, которое соответствует одной \w (то есть. [А-z0-9A-Z])
  • ([.-]) следующим символом должен быть либо точка, либо дефис, с этого момента \1 будет содержать это значение
  • ([a-z0-9]{2}\1){0,8} мы хотим, чтобы нуль до 8 пары 2 * α числовые символы + первый разделитель.
  • [a-z0-9]{2} строка должна заканчиваться двумя буквенными символами.
+0

@refp ... это сработало отлично. Благодаря! – MikeTWebb

-1

Это может работать:

^[\w\d][\w\d](?:([.-])[\w\d][\w\d])(?:\1[\w\d][\w\d]){,8}

0

Это будет что-то вроде:

[a-z0-9]{2}\([.][a-z0-9]{2}\){1,9}|[a-z0-9]{2}\([-][a-z0-9]{2}\){1,9} 

{2} означает ровно 2

{1,9} означает, по меньшей мере, один, и до 9

\ (что-то \) является группировкой

| б означает совпадение а или б

+0

@smendola ... спасибо за объяснение приведенных выше определений. Ницца! Tha было действительно полезно для моего понимания RegEx – MikeTWebb

+0

@smendola [.] Не будет соответствовать ни одному элементу? но только «.» персонаж? –

1

Я попытался это:

^[[:alnum:]]{2}([-.])[[:alnum:]]{2}(?:\1[[:alnum:]]{2}){0,8}$ 

Вам нужны анкеры на обоих концы, чтобы он соответствовал всей строке. Использование [[:alnum:]] соответствует всем буквенно-цифровым, основанным на языковой версии. Если вы хотите только те, которые мы рассматриваем на английском языке, независимо от языка, вы бы хотели использовать [A-Za-z0-9] в каждом случае.

Самая сложная часть - это обратная ссылка, \1, которая гарантирует, что вы всегда используете один и тот же разделитель --- это относится к скользящим скобкам в ([-.]). Таким образом, когда у вас есть еще 0-8 повторений разделителя, за которым следуют 2 алфавитумера, разделитель всегда один и тот же.

Я пробовал это в Perl, и он передает несколько тестовых строк, которые я набросил на него. Ваш пробег может измениться, если вы используете другой язык/библиотеку.

+0

+1 для использования '\ 1' для того же разделителя. – Toto

+0

@david ... Я пробовал 01.01.01, и он не прошел. Я использую C# .Net – MikeTWebb

+0

Это проходит в Perl. Может быть .net не поддерживает классы символов Perl? Вы пытались заменить '[[: alnum:]]' на '[A-Za-z0-9]' во всех случаях? –

0

Возможно ...

([\p{L}0-9]{2})(\.|-)([\p{L}0-9]{2}) 

Это обрабатывает письма Unicode, но я не уверен, что это правильно для ваших нужд, как первые две строки в «Действительно» набор содержит элементы, которые < 2 alpha-num> <.> < 2 альфа-num> <.> < 2 альфа-num> <.> < 2 альфа-число>, а не тот формат, который вы упоминаете в вопросе, где вы ищете <-альфа-NUM> <.> < 2 альфа-NUM>

Надеется, что это помогает.