哪种正则表达式可以允许特殊字符但拒绝仅使用特殊字符的字符串?

时间:2019-03-13 20:41:03

标签: c# regex

我正在写一个正则表达式来表示可接受的名字和姓氏。目前,我只想允许以下内容

  • a到z
  • A到Z
  • '
  • (-)(破折号)
  • 变音符号

我的正则表达式为@"^[a-zA-Z-'\p{L}]*$"

尽管我想允许使用单引号和破折号,但我也不希望名称以破折号 just 或以撇号 just 开头。因此,为此,我在Fluent Validator中编写了一些额外的正则表达式来捕获这些极端情况,但不允许我将它们拆分。

        .Matches(@"^[a-zA-Z-'\p{L}]*$")
        .Matches(@"[^-]")
        .Matches(@"[^']");

这也不是什么好事,因为我也不想允许像''''''这样的单引号或像---------这样的短划线的名字。

是否可以编写出更有效的正则表达式来处理所有这些情况?

1 个答案:

答案 0 :(得分:1)

您可以为此使用negative lookahead assertion

@"^(?![-']*$)[-'\p{L}]*$"

a-zA-Z中也包含\p{L}

说明:

^          # Start of string
(?!        # Assert that it's impossible to match...
 [-']*     # a string of only dashes and apostrophes
 $         # that extends to the end of the entire string.
)          # End of lookahead.
[-'\p{L}]* # Match the allowed characters.
$          # End of string.