使用正则表达式的 FluentValidation 不允许 N/A 或 NA 忽略大小写和空格
Posted
技术标签:
【中文标题】使用正则表达式的 FluentValidation 不允许 N/A 或 NA 忽略大小写和空格【英文标题】:FluentValidation with Regular Expression not allowing N/A or NA Ignoring Case and White Space 【发布时间】:2019-12-27 23:02:30 【问题描述】:我在我的 ASP.NET MVC 应用程序中使用 FluentValidation
,并且某些字段不允许用户输入 N/A
及其变体。
我发现 Tim 在 SO question 中的回答有些帮助,但不完全是我想要的。它确实有效,但我不想使用RegexOptions.IgnoreCase
作为验证,使用这样的选项似乎只发生在服务器端。
RuleFor(x => x.Question01)
.Matches(@"^(?!\s*n\s*/?\s*a\s*$).*", RegexOptions.IgnoreCase)
.WithMessage("Invalid answer.");
我正在寻找一个纯正则表达式解决方案(不使用RegexOptions.IgnoreCase
),忽略大小写和空格以允许除N/A
、N / A
、NA
、N A
、n/a
、n / a
之外的任何内容、na
、n a
等
【问题讨论】:
【参考方案1】:这个解决方案确实有效:
RuleFor(x => x.Question01)
.Matches(@"^(?!\s*[Nn]\s*/?\s*[Aa]\s*$).*")
.WithMessage("Invalid answer.");
【讨论】:
【参考方案2】:如果您想完全匹配这些值并且不允许大小写混合的组合,您可以使用alternation 将它们全部列出。
注意\s
也匹配换行符。
如果您想允许除此模式之外的所有内容,您可以使用否定前瞻 (?!
来断言右侧的内容不是此模式,并使用内联修饰符 (?i)
或 (?i:
^(?!(?i:n */? *a)$).+$
^
字符串开始
(?!
负前瞻,断言右边的不是
(?i:
不区分大小写匹配的内联修饰符
n */? *a
匹配 n
,可选 /
被可选空格包围
)$
关闭内联修饰符并断言字符串结束
)
关闭前瞻
.+
匹配任意字符 1 次以上
$
断言字符串结束
.NET regex demo
如果这也适用于 javascript,您可以使用字符类,因为不支持内联修饰符。
^(?!(?:[nN] *\/? *[aA])$).+$
Regex demo
【讨论】:
他说忽略空格,所以我假设 n /a 和 n / a 也会匹配 @andyb952 你是对的,但不确定大小写是否可以混合。我已经使用空格以及大小写变体对其进行了更新。 是的,我的问题中的“等”表示任何变体,包括小写和大写的混合,同时忽略空格。 感谢它现在有效。但是,由于某种原因,它只能在服务器端工作。我刚刚发布的解决方案甚至可以在客户端工作。只要我输入N/A
或其任何变体验证消息就会立即出现。
@PateeGutee 如果您想将此模式与 Javascript 一起使用,那么您可以使用匹配大写或小写字符的字符类,因为 Javascript 不支持内联修饰符 (?i)
或 (?i:
对于例如^(?!(?:[nN] *\/? *[aA])$).+$
见regex101.com/r/Sc8lMr/1【参考方案3】:
此正则表达式将匹配 N/A、n/a、NA、na 的任何变体
忽略 N -> A 和 N -> / 和 / -> A 之间的所有空格
\s*
不区分大小写
?i:
最终结果:
^(?i:n\s*/?\s*a)$
【讨论】:
相反。在FluentValidation
中使用时,它允许N/A
及其变体,但不允许正确答案。以上是关于使用正则表达式的 FluentValidation 不允许 N/A 或 NA 忽略大小写和空格的主要内容,如果未能解决你的问题,请参考以下文章
在 .NET Core 中使用 FluentValidation 和依赖注入