Я вижу, вы знаете, что длина строки может быть проверено вне регулярных выражений, так что, я буду включать проверку длины строки в регулярное выражение ниже только для образовательных целей.
Основная проблема заключалась в том, что вы на самом деле написали шаблон, который соответствует 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}
) должно быть в конце строки ($
).
Попробуйте '@"^(? =. {24} $) (? = (?: \ P {L} * \ p {L}) {8}). * \ D {5} $ " ' –
Ограничение строки также может быть установлено с атрибутом' [StringLength (24)] '. Затем регулярное выражение будет '[RegularExpression (@"^(? = (?: \ P {L} * \ p {L}) {8}). * \ D {5} $ ")]' или '[ RegularExpression (@ "^ (? = (?: \ P {L} * \ p {L}) {8}) [\ p {L} \ p {N}] * \ p {N} {5} $ ")]' –
Если шаблон должен работать на стороне клиента тоже нужно использовать что-то вроде '[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} $» '). –