RegEx的名称:任何语言,但首字母必须是大写

时间:2016-09-20 09:33:31

标签: regex

我要求接受名字作为输入并检查第一个字母是否为大写字母,并且在字符串结尾后可以有1个空格。

此RegEx适用于'Bob':

^[A-Z][A-Za-z\p{L}]+[\s,.'\-]?[a-zA-Z\p{L}]*$

然后,额外的要求是允许任何涉及允许unicode的语言/字符。

此RegEx适用于俄语名称:'Афанасий'

^[A-Z\p{L}][A-Za-z\p{L}]+[\s,.'\-]?[a-zA-Z\p{L}]*$

...但是,虽然它允许使用unicode,但它也允许我输入带有小写字母的“bob”,而RegEx允许通过它。

有没有办法允许unicode并且在不是资本时仍然标记第一个字母? (使用RegEx)

我可以进行一些代码更改以解决这个问题,但是能够将它全部保存在RegEx值中而不进行代码更改会很好。

1 个答案:

答案 0 :(得分:5)

任何Unicode大写字母都可以与\p{Lu}匹配。

使用

^\p{Lu}\p{L}+[\s,.'\-]?\p{L}*$

^\p{Lu}\p{L}+(?:[\s,.'-]\p{L}+)?$

请参阅regex demo 1regex demo 2。第二个正则表达式更精确,因为它不允许尾随空格,逗号等([\s,.'-]字符类中定义的内容)。

请注意,使用[A-Za-z\p{L}]没有意义,因为\p{L}已匹配[a-zA-Z]

模式详情

  • ^ - 字符串开头
  • \p{Lu} - 一个大写的Unicode字母
  • \p{L}+ - 一个或多个Unicode字符
  • (?:[\s,.'-]\p{L}+)? - 一个或零个(可选)序列
    • [\s,.'-] - 一个空格,,.'或连字符
    • \p{L}+ - 一个或多个Unicode字母
  • $ - 字符串结束。