【问题标题】:Regex for including alphanumeric and special characters but not special characters on their own用于包含字母数字和特殊字符但不包含特殊字符的正则表达式
【发布时间】:2021-06-10 07:51:15
【问题描述】:

我正在尝试为数据成员创建一些验证规则,但我的一个正则表达式遇到了问题。目前我正在使用@"[a-zA-Z']+$",因为我想允许以下字符串:

  • 约翰·史密斯(有效)
  • 史蒂夫·麦克米伦(有效)
  • '''''(无效)
  • Hill St'(有效)

这按预期工作,但是当我尝试传递一个只包含特殊字符的字符串时,它允许它。有没有办法可以允许特殊字符',但不允许单独使用?

这是我创建的规则:

        RuleFor(h => h.Name)
            .Cascade(CascadeMode.Stop)
            .NotEmpty().WithMessage("{PropertyName} is required")
            .Matches(@"[a-zA-Z']+$").WithMessage("{PropertyName} is invalid");

【问题讨论】:

  • 您是否总是在大写字符后跟一个小写字母,然后是单引号?如果是这样,请尝试:^[A-Z][a-z]'?[a-z]*(?: [A-Z][a-z]'?[a-z]*)*$
  • 你可以使用@"^(?!'$)[a-zA-Z']+$"
  • 完美运行@WiktorStribiżew

标签: c# regex fluentvalidation


【解决方案1】:

你可以使用

RuleFor(h => h.Name)
    .Cascade(CascadeMode.Stop)
    .NotEmpty().WithMessage("{PropertyName} is required")
    .Matches(@"^(?!'+$)[a-zA-Z']+(?:\s+[a-zA-Z']+)*$").WithMessage("{PropertyName} is invalid");

请参阅regex demo

  • ^ - 匹配字符串位置的开始
  • (?!'+$) - 如果有一个或多个 ' 字符后跟紧靠当前(即字符串开头)位置右侧的字符串结尾位置,则匹配失败。
  • [a-zA-Z']+ - 一个或多个字母或'
  • (?:\s+[a-zA-Z']+)* - 零次或多次重复
    • \s+ - 一个或多个空格
    • [a-zA-Z']+ - 一个或多个字母或' 字符
  • $ - 字符串结束。

【讨论】:

  • 如果值不止一个',我怎样才能让它停止?它适用于 1,但如果值为 '' 或更大,则允许它
  • 它几乎可以工作,但在' 之后不允许有空格,例如St' Hellens
最近更新 更多