Regex.IsMatch зависает, очевидно, он ищет бесконечные совпадения и никогда не возвращается - PullRequest
0 голосов
/ 24 января 2019

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

new Regex("^\\s*[0-9]+\\s*(,*\\s*[0-9]+\\s*)*$")

1 Ответ

0 голосов
/ 24 января 2019

Шаблон (,*\\s*[0-9]+\\s*)* внутри регулярного выражения содержит несколько необязательных шаблонов, в то время как только [0-9]+ является обязательным, поэтому это классический (a+)+ подобный шаблон, вызывающий катастрофический возврат с несоответствующими строками.

Вы должны убедиться, что внутри количественной группы есть по крайней мере еще 1 обязательный образец, например,

@"^\s*[0-9]+(?:(?:\s*,\s*|\s+)[0-9]+)*\s*$"

Подробности

  • ^ - начало строки
  • \s* - необязательные 0+ начальных пробелов
  • [0-9]+ - 1+ цифр
  • (?:(?:\s*,\s*|\s+)[0-9]+)* - 0+ повторений:
    • (?:\s*,\s*|\s+) - либо ,, заключенный в 0+ пробелов, либо просто 1+ пробелов
    • [0-9]+ - 1+ цифр
  • \s* - необязательные 0+ конечные пробелы
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...