Регулярное выражение в поведении RegularExpressionAttribute - PullRequest
0 голосов
/ 22 октября 2018

Я использую это регулярное выражение: @"[ \]\[;\/\\\?:*""<>|+=]|^[.]|[.]$"

Первая часть [ \]\[;\/\\\?:*""<>|+=] должна соответствовать любому из символов в скобках.

Следующая часть ^[.] должна совпадать, если строка начинается с «точки»

Последняя часть [.]$ должна совпадать, если строка заканчивается «точкой»

Это прекрасно работает, если я использую функцию Regex.IsMatch().Однако, если я использую RegularExpressionAttribute в ASP.NET MVC, я всегда получаю недопустимую модель.Кто-нибудь знает, почему происходит такое поведение?

Примеры:

«abcdefg» не должен совпадать

«. Abcdefg» должен совпадать

«abc.defg» не должен совпадать

"АБВГДЕЖ."должно соответствовать

"abc [defg" должно соответствовать

Заранее спасибо!

РЕДАКТИРОВАТЬ:

RegularExpressionAttribute Specifies that a data field value in ASP.NET Dynamic Data must match the specified regular expression.,

Что значит.Мне нужно, чтобы "abcdef" совпадал, а ".abcdefg" не совпадал.В основном отрицание всего выражения, которое я имею выше.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Ваше регулярное выражение - это чередование , которое соответствует 1 символу из 3 классов символов, первый из которых состоит из более чем 1 символа, второй - в начале строки, а третий - в точке.конец строки.

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

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

Или третье с использованием положительного взгляда, утверждающего, что строка содержитхотя бы один из символов [\][;\/\\?:*"<>|+=]

^\.[a-z \][;\/\\?:*"<>|+=]+$|^[a-z \][;\/\\?:*"<>|+=]+\.$|^(?=.*[\][;\/\\?:*"<>|+=])[a-z \][;\/\\?:*"<>|+=]+$

Regex demo

0 голосов
/ 22 октября 2018

Необходимо убедиться, что шаблон соответствует всей строке.

В общем случае вы можете добавить / добавить шаблон с помощью .*.

Здесь вы можете использовать

.*[ \][;/\\?:*"<>|+=].*|^[.].*|.*[.]$

Или, чтобы сделать его немного более эффективным (т. Е. Уменьшить обратное отслеживание в первой ветви), класс отрицанных символов будет работать лучше:

[^ \][;/\\?:*"<>|+=]*[ \][;\/\\?:*"<>|+=].*|^[.].*|.*[.]$

Но это лучшечтобы поместить ветви, соответствующие тексту в начале / конце строки, как первые ветви:

^[.].*|.*[.]$|[^ \][;/\\?:*"<>|+=]*[ \][;/\\?:*"<>|+=].*

ПРИМЕЧАНИЕ. Вам не нужно экранировать символы / и ? внутри регулярного выражения .NET, поскольку вытам нельзя использовать разделители регулярных выражений.

Объявление C # последнего шаблона будет выглядеть так:

@"^[.].*|.*[.]$|[^ \][;/\\?:*""<>|+=]*[ \][;/\\?:*""<>|+=].*"

См. .NET dege .

RegularExpressionAttrubute:

[RegularExpression(
  @"^[.].*|.*[.]$|[^ \][;/\\?:*""<>|+=]*[ \][;/\\?:*""<>|+=].*", 
  ErrorMessage = "Username cannot contain following characters: ] [ ; / \\ ? : * \" < > | + =")
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...