带有正则表达式的 FluentValidation 不允许 N/A 或 NA 忽略大小写和白色 Space

FluentValidation with Regular Expression not allowing N/A or NA Ignoring Case and White Space

我在我的 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 / anan a

如果您想精确匹配这些值并且不允许混合大小写的组合,您可以使用 alternation.

列出它们

注意 \s 也匹配换行符。

如果你想允许除此模式之外的所有模式,你可以使用否定先行 (?! 来断言右边的不是此模式和内联修饰符 (?i)(?i:

^(?!(?i:n */? *a)$).+$
  • ^ 字符串开头
  • (?! 否定前瞻,断言右边的不是
    • (?i: 不区分大小写匹配的内联修饰符
    • n */? *a 匹配 n,可选 / 包围可选空格
    • )$ 关闭内联修饰符并断言字符串结束
  • ) 关闭前瞻
  • .+ 匹配任意字符 1+ 次
  • $ 断言字符串结束

.NET regex demo

如果这也适用于 Javascript,您可以使用字符 class,因为不支持内联修饰符。

^(?!(?:[nN] *\/? *[aA])$).+$

Regex demo

此正则表达式将匹配 N/A、n/a、NA、na

的任何变体

忽略 N -> A 和 N -> / 和 / -> A 之间的所有空格

\s*

不区分大小写

?i:

最终结果:

^(?i:n\s*/?\s*a)$

这个解决方案确实有效:

RuleFor(x => x.Question01)
    .Matches(@"^(?!\s*[Nn]\s*/?\s*[Aa]\s*$).*")
    .WithMessage("Invalid answer.");