Разрешить некоторые, но не все пробелы в регулярном выражении MVC - PullRequest
2 голосов
/ 04 ноября 2019

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

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

[Required(ErrorMessage = "The Name field is required.")]
[StringLength(100, ErrorMessage = "The Name can only be a maximum 
    of 100 characters long.")]
[RegularExpression(@"[REGEX HERE]", 
    ErrorMessage = "The Name field can not be white space only.")]
public string Name { get; set; }

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

  • @"\S+?"
  • @"\S+"
  • @"\S"
  • @"\s"

Ожидаемые результаты:следует:

  • '' < FAIL due to required attribute.
  • 'red' < PASS
  • 'red cake' < PASS
  • ' ' < FAIL due to only white space present

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

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Как насчет чего-то вроде:

^.*\S.*$

Это ...

  • что-нибудь в начале строки (включая ничего),
  • , за которым следуетсимвол без пробелов,
  • , за которым следует что угодно (включая ничто).

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

1 голос
/ 04 ноября 2019

Итак, я провел несколько тестов и пришел к выводу, что aspnet всегда интерпретирует проверку RegularExpression как полное совпадение строк. Нет никакой разницы между обоими шаблонами \S и ^\S$, кажется, что метод всегда добавляет ^ в начале и $ в конце шаблона. Разве это ошибка или намеренное поведение, я не знаю. Вот почему \S терпит неудачу, когда он должен работать.

И ответ, указанный в комментариях @ Flydog57, заключается в использовании .*\S.*. Обратите внимание, что ^ и $ не нужны, как объяснено выше.

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

Похоже, что полное соответствие по конструкции, а не ошибка. Согласно исходному коду , строка 66 :

Мы ищем точное совпадение, а не просто поисковый запрос.

var m = Regex.Match(stringValue);

// We are looking for an exact match, not just a search hit. This matches what 
// the RegularExpressionValidator control does 
return (m.Success && m.Index == 0 && m.Length == stringValue.Length); 

ПроверкаВыпущено , это и , это проблем, которые я открыл для более подробной информации.

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