在 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 正则表达式中允许一些但不是所有的空格的主要内容,如果未能解决你的问题,请参考以下文章