Regex.IsMatch挂起,显然它正在寻找无限匹配且永不返回

时间:2019-01-24 11:52:07

标签: c# regex

我希望在下面使用正则表达式验证用户输入。允许用户输入由逗号或空格分隔的正整数值。问题是在否定测试期间,我输入一个特殊字符,例如?或period(。),IsMatch挂起。任何帮助表示赞赏。

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

1 个答案:

答案 0 :(得分:0)

正则表达式中的(,*\\s*[0-9]+\\s*)*模式包含多个可选模式,而只有[0-9]+是必需的,因此它是经典的(a+)+类似模式,导致catastrophic backtracking具有不匹配的字符串。

您应该确保量化组内至少还有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+尾随空格
  • $-字符串的结尾。