用于包含字母数字和特殊字符但不包含特殊字符的正则表达式

时间:2021-06-10 07:51:15

标签: c# regex fluentvalidation

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

  • 约翰·史密斯(有效)
  • Steve Mc'millan(有效)
  • '''''(无效)
  • Hill St'(有效)

这按预期工作,但是当我尝试传递仅包含特殊字符的字符串时,它允许它。有没有办法允许我允许特殊字符 ',但不允许它自己?

这是我创建的规则:

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

1 个答案:

答案 0 :(得分: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']+ - 一个或多个字母或 ' 个字符
  • $ - 字符串结束。