在 MVC 正则表达式中允许一些但不是所有的空格

Posted

技术标签:

【中文标题】在 MVC 正则表达式中允许一些但不是所有的空格【英文标题】:Allow some, but not all white space in a MVC Regular Expression 【发布时间】:2020-02-29 23:00:26 【问题描述】:

我正在尝试在我的 MVC 模型的一个属性上创建一个正则表达式,该属性将允许任何文本,但不允许所有空格。

我已经阅读了很多关于此的帖子,但没有一个按我预期的那样做,所以要么我遗漏了一些非常明显的东西,要么我没有在寻找正确的东西。

[Required(ErrorMessage = "The Name field is required.")]
[StringLength(100, ErrorMessage = "The Name can only be a maximum 
    of 100 characters long.")]
[RegularExpression(@"[REGEX HERE]", 
    ErrorMessage = "The Name field can not be white space only.")]
public string Name  get; set; 

除了最后一个错误消息之外,所有错误消息都可以正常工作。我已经尝试了以下正则表达式字符串(以及许多其他字符串)但没有成功,通常当我输入任何空白字符(一直使用空格字符)时,会出现错误消息,有时当我添加多个字符时:

@"\S+?" @"\S+" @"\S" @"\s"

我期望的结果如下:

'' < FAIL due to required attribute. 'red' < PASS 'red cake' < PASS ' ' < FAIL due to only white space present

不用说我对正则表达式不是很有经验,但是这是一个简单的正则表达式,真的难倒我!

【问题讨论】:

你的意思是喜欢\s*吗? @Thefourthbird 不会在最后一种情况下通过该模式(所有空格)吗? ^.*\S.*$ 这样的东西怎么样。那是行首的任何内容(不包括任何内容),然后是非空白字符,然后是之后的任何内容(不包括任何内容)。它似乎在正则表达式测试工具中对我有用。只要您至少有一个非空白字符,就很高兴 \S 应该可以工作,这意味着它包含一个非白字符。 \s* 失败,除非所有空格都存在。 \S 以一个字符传递,但随后会因任何后续字符而失败,无论是否有空格。 【参考方案1】:

怎么样:

^.*\S.*$

那是……

行首的任何内容(包括任何内容), 后跟一个非空白字符, 之后是任何内容(包括任何内容)。

它似乎在 Regex 测试工具中对我有用。只要您至少有一个非空白字符,就很高兴。

【讨论】:

【参考方案2】:

更新:

现在这个行为是documented。

原答案:

所以,我做了一些测试并得出结论,aspnet 总是将RegularExpression 验证解释为完整的字符串匹配。 \S^\S$这两种模式没有区别,似乎该方法总是在模式的开头添加^,在模式的末尾添加$。我不知道这是一个错误还是有意的行为。所以,这就是为什么\S 在它应该工作的时候却失败了。

答案,正如@Flydog57 在 cmets 中所说,使用.*\S.*。请注意,^$ 不是必需的,如上所述

编辑:

这似乎是完全匹配的设计,而不是错误。根据source code, line 66:

我们正在寻找完全匹配,而不仅仅是搜索结果。

var m = Regex.Match(stringValue);

// We are looking for an exact match, not just a search hit. This matches what 
// the RegularExpressionValidator control does 
return (m.Success && m.Index == 0 && m.Length == stringValue.Length); 

查看我打开的this 和this 问题以了解更多详细信息。

【讨论】:

以上是关于在 MVC 正则表达式中允许一些但不是所有的空格的主要内容,如果未能解决你的问题,请参考以下文章

在正则表达式电子邮件中允许 + 验证电子邮件 [重复]

如何在 JavaScript 文件中允许空格?

在逗号分隔的字母数字正则表达式中添加空格

在 MVC 输入中允许特定格式的电子邮件地址

在 ag-grid 过滤器中允许空格

CSS 选择器中允许的注释语法