使用正则表达式的 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/AN / ANAN An/an / a 之外的任何内容、nan 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 忽略大小写和空格的主要内容,如果未能解决你的问题,请参考以下文章

模型验证组件 FluentValidation

模型验证组件 FluentValidation

在 .NET Core 中使用 FluentValidation 和依赖注入

使用 FluentValidation 实现数据校验验重

如何在 Web API 中使用 FluentValidation 执行异步 ModelState 验证?

翻译FluentValidation验证组件的使用