C# MVC - 具有单个空格或多个空格的整数的正则表达式

Posted

技术标签:

【中文标题】C# MVC - 具有单个空格或多个空格的整数的正则表达式【英文标题】:C# MVC - Regex for integers with a single space or multiple spaces 【发布时间】: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 看我上面的评论 【参考方案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。

【讨论】:

以上是关于C# MVC - 具有单个空格或多个空格的整数的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式或用单个空格替换多个空格的方法

oracle用一个空格更新一列中的多个空格

用 JavaScript 字符串中的单个空格替换多个空格

C# split字符串 依据1个或多个空格

java 从字符串中 以单个或多个空格进行分隔 提取字符串

在R中读取具有多个空格作为分隔符的文本文件