C # MVC - регулярное выражение для целых чисел с одним пробелом или несколькими пробелами - PullRequest
1 голос
/ 03 июня 2019

У меня есть regex, который ограничивает поле input целыми числами с пробелами:

[Required(ErrorMessage = "This field can not be left empty")]
[RegularExpression(@"^[\d\s]+$", ErrorMessage = "Please enter integers only with spaces")]
public string Numbers { get; set; }

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

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

List<int> ints = new List<int>();
ints = numbers.TrimEnd().Split(' ').Select(s => int.Parse(s)).OrderBy(i => i).ToList();

, которая разбивает все числа вверх, сортирует их в порядке возрастания и помещает их в List<int>, чтобы он выглядел какхотя функция Split учитывает только один пробел.

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

1 Ответ

1 голос
/ 03 июня 2019

Если вы хотите, чтобы пользователи вводили любое количество пробелов в любом месте строки, вам следует рассмотреть возможность изменения \s с пробелом в регулярном выражении или вместо String.Split() используйте Regex.Splitс шаблоном \s+, чтобы оставаться согласованным с входными данными, или просто использовать регулярное выражение для извлечения кусков цифр с помощью \d+.

Итак, используйте либо

[RegularExpression(@"^[\d ]+$", ErrorMessage = "Please enter integers only with spaces")]
// ...
ints = numbers.TrimEnd().Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries).Select(s => int.Parse(s)).OrderBy(i => i).ToList();

Или оставьте то же самоерегулярное выражение, как у вас есть и захватить все числа с регулярным выражением:

ints = Regex.Matches(numbers, @"\d+").Cast<Match>().Select(s => int.Parse(s)).OrderBy(i => i).ToList();

Если вы планируете запретить ввод более 1 пробела между числами, используйте любой из

^ *[0-9]+(?: [0-9]+)* *$
^\s*\d+(?:\s\d+)*\s*$

См. regex demo .

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