2016-10-13 2 views
1

У меня есть некоторые требования к проверке данных в поле в одной из моих моделей в веб-службе, и я чувствую, что Regex подходит, но я не могу составить или найти, что Я ищу.RegularExpression DataAnnotation тестирование шаблонов в строке

  1. Строка должна быть 24 буквенно-цифровых символа.
  2. По крайней мере, из 8 персонажей должен быть Альфа.
  3. Последние 5 символов строки должны быть числовыми.

[RegularExpression(@"^[\p{L}8\p{N}.(\d{5}5]+$")] 

public string VIN { get; set; } 
+0

Попробуйте '@"^(? =. {24} $) (? = (?: \ P {L} * \ p {L}) {8}). * \ D {5} $ " ' –

+1

Ограничение строки также может быть установлено с атрибутом' [StringLength (24)] '. Затем регулярное выражение будет '[RegularExpression (@"^(? = (?: \ P {L} * \ p {L}) {8}). * \ D {5} $ ")]' или '[ RegularExpression (@ "^ (? = (?: \ P {L} * \ p {L}) {8}) [\ p {L} \ p {N}] * \ p {N} {5} $ ")]' –

+1

Если шаблон должен работать на стороне клиента тоже нужно использовать что-то вроде '[StringLength (24)] и' [RegularExpression ("^ (? = (?: [^ A-Za-z] * [a-zA-Z]) {8}) [a-zA-Z0-9] * [0-9] {5} $ ")]' (или если вам нужно использовать длину строки внутри шаблона, '"^(? =. {24} $) (= (?:? [^ A-Za-Z] * [A-Za-Z]) {8}) [A-Za-Z0-9] * [0-9] {5} $» '). –

ответ

1

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

Основная проблема заключалась в том, что вы на самом деле написали шаблон, который соответствует 1 или более символам, определенным внутри класса символов [...]. ^[\p{L}8\p{N}.(\d{5}5]+$ соответствует началу строки (^), то 1+ символов (либо буквы (\p{L}), 8, цифры (\p{N}), ., (, опять же цифры (но с \d), {, 5, }, снова 5) , а затем конец строки ($).

Вы должны использовать lookaheads вводить ограничения:

@"^(?=.{24}$)(?=(?:\P{L}*\p{L}){8}).*\d{5}$" (server side) 
@"^(?=.{24}$)(?=(?:[^A-Za-z]*[a-zA-Z]){8}).*[0-9]{5}$" (client/server side) 

или - если ваша строка не может содержать произвольные символы, но только буквы и цифры:

@"^(?=.{24}$)(?=(?:\P{L}*\p{L}){8})[\d\p{L}]*\d{5}$" (server side) 
@"^(?=.{24}$)(?=(?:[^A-Za-z]*[a-zA-Z]){8})[a-zA-Z0-9‌​]*[0-9]{5}$" (client/server side) 

Разница между/клиентской стороне сервера что серверная сторона принимает регулярное выражение .NET и, таким образом, знает Unicode, \d может соответствовать всем номерам Unicode, а \p{L} соответствует любой букве Unicode, а клиентская сторона поддерживает только регулярное выражение ECMAScript и, следовательно, не является Unicode осознанный.

Детали (давайте рассмотрим последний на стороне сервера рисунок):

  • ^ - начало строки
  • (?=.{24}$) - длина всей линии должно быть 24 символов (обратите внимание . не соответствует переносы строк)
  • (?=(?:\P{L}*\p{L}){8}) - должно быть по крайней мере 8 букв предшествовала 0+, отличных от букв
  • символов
  • [\d\p{L}]* - 0+ цифр или букв, как можно больше, но
  • \d{5}$ - 5 цифр (\d{5}) должно быть в конце строки ($).