C# 正则表达式不允许N/A或NA忽略大小写和空白的FluentValidation

C# 正则表达式不允许N/A或NA忽略大小写和空白的FluentValidation,c#,regex,asp.net-mvc,fluentvalidation,C#,Regex,Asp.net Mvc,Fluentvalidation,我在我的ASP.NET MVC应用程序中使用FluentValidation,对于某些字段,不允许用户输入N/A及其变体 我发现蒂姆的答案有些帮助,但并不完全是我想要的。它确实可以工作,但我不想使用RegexOptions.IgnoreCase作为验证,使用这样的选项似乎只在服务器端发生 RuleFor(x=>x.01) .Matches(@“^(?!\s*n\s*/?\s*a\s*$)*”,RegexOptions.IgnoreCase) .WithMessage(“无效答案”); 我正在寻

我在我的ASP.NET MVC应用程序中使用
FluentValidation
,对于某些字段,不允许用户输入
N/A
及其变体

我发现蒂姆的答案有些帮助,但并不完全是我想要的。它确实可以工作,但我不想使用
RegexOptions.IgnoreCase
作为验证,使用这样的选项似乎只在服务器端发生

RuleFor(x=>x.01)
.Matches(@“^(?!\s*n\s*/?\s*a\s*$)*”,RegexOptions.IgnoreCase)
.WithMessage(“无效答案”);

我正在寻找一个纯正则表达式解决方案(不使用
RegexOptions.IgnoreCase
),忽略大小写和空格,以允许除
N/a
N/a
NA
NA
N/a
N/a
NA
NA
,之外的任何内容,等等。

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

注意
\s
也与换行符匹配

如果您想允许除此模式之外的所有模式,可以使用负前瞻
(?!
来断言右侧的不是此模式,并使用内联修饰符
(?i)
(?i:

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

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

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

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

注意
\s
也与换行符匹配

如果您想允许除此模式之外的所有模式,可以使用负前瞻
(?!
来断言右侧的不是此模式,并使用内联修饰符
(?i)
(?i:

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

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

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

此正则表达式将匹配N/A、N/A、NA、NA的任何变化

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

\s*

对案件不敏感

?一:

最终结果:

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

此正则表达式将匹配N/A、N/A、NA、NA的任何变化

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

\s*

对案件不敏感

?一:

最终结果:

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

此解决方案确实有效:

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

此解决方案确实有效:

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

他说忽略空白,所以我假设n/a和n/a也都会match@andyb952你是对的,不确定大小写是否可以混合。我已经用空格和大小写的变体对它进行了更新。是的,“etc”在我的问题中,是指任何变体,包括小写和大写的混合,而忽略空格。谢谢,它现在可以工作。但是,由于某些原因,它只在服务器端工作。我刚才发布的解决方案甚至可以在客户端工作。只要我键入
N/A
或它的任何变体,验证消息就会立即出现。@PateeGutee,如果你想要的话t若要在Javascript中使用此模式,则可以使用匹配大写或小写字符的字符类,因为Javascript不支持内联修饰符
(?i)
(?i:
例如
^(?(?:[nN]*\/?*[aA])$).+$
看,他说忽略空白,所以我假设n/a和n/a也会同时忽略空白match@andyb952你是对的,不确定大小写是否可以混合。我已经用空格和大小写的变体对它进行了更新。是的,“etc”在我的问题中,是指任何变体,包括小写和大写的混合,而忽略空格。谢谢,它现在可以工作。但是,由于某些原因,它只在服务器端工作。我刚才发布的解决方案甚至可以在客户端工作。只要我键入
N/A
或它的任何变体,验证消息就会立即出现。@PateeGutee,如果你想要的话t若要在Javascript中使用此模式,则可以使用匹配大写或小写字符的字符类,因为Javascript不支持内联修饰符
(?i)
(?i:
例如
^(?(?:[nN]*\/?*[aA])$).+$
看到它做的是相反的。当在
FluentValidation
中使用时,它允许
N/A
及其变体,但不允许正确答案。它做的是相反的。当在
FluentValidation
中使用时,它允许
N/A
及其变体,但不允许正确答案。