【问题标题】:C# MVC - Regex for integers with a single space or multiple spacesC# MVC - 具有单个空格或多个空格的整数的正则表达式
【发布时间】:2019-10-18 22:40:46
【问题描述】:

我有一些 regexinput 字段限制为带空格的整数:

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

我一直在用单个空格测试我的应用程序,因为输入的任何其他垃圾都是通过我的验证检测到的。

但是,我刚刚注意到验证不会在 multiple 空格上使用,这很好,因为我希望用户能够做到这一点以及 single 个空格,但我发现这行代码有问题:

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

它将所有数字拆分,按升序排序,并将它们放入List&lt;int&gt;,因此看起来Split 函数只占一个空间。

我不确定最好的解决方案是什么。可能是将regex 限制为单个 空格的情况,如果是这样,那会是什么情况,或者修改上面的代码以接受多个空格?

【问题讨论】:

  • StringSplitOptions.RemoveEmptyEntries 添加到Split 方法。
  • 如果您不想只允许空格或多个空格,您可以使用^\d+(?: \d+)*$
  • 使用.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries) 而不是.Split(' ')。您不必限制输入一个或多个空格。但是,将正则表达式更改为 ^[0-9 ]+$ 甚至 [0-9 ]+ 是有意义的,因为整个输入应该与正则表达式匹配。
  • 我尝试将StringSplitOptions.RemoveEmptyEntries 添加到Split 方法中,但出现此错误:cannot convert from System.StringSplitOptions to char
  • 看我上面的评论

标签: c# regex asp.net-mvc


【解决方案1】:

如果您想让用户在字符串的任意位置输入任意数量的空格,您应该考虑在正则表达式中使用空格更改\s,或者使用String.Split() 来代替@987654324 @ 与 \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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多