【问题标题】:Regex to allow any language characters in the form of full name and starting with letter正则表达式允许以全名形式并以字母开头的任何语言字符
【发布时间】:2015-10-10 15:04:05
【问题描述】:

我尝试验证名称字段,我希望允许最终用户在此字段中添加任何内容,例如 Merianos NikosΜέριανος Νίκος(希腊语)或任何其他语言的字符以相同的形式。

形式为首字母大写,单词其余字母小写,至少两个单词。

目前,我有这个正则表达式 /^([A-Z][a-z]*((\s)))+[A-Z][a-z]*$/ 可以完美地与英语一起使用,但不适用于希腊语,也许还可以与其他语言一起使用。

最后,我想验证另一个至少有一个单词的字段,第一个字母大写,但是这个字段也可以包含单词后面的字符。

目前我使用的 followign 正则表达式 /^[\s\w\.\-_]+$/ 有效,但我又遇到了希腊语和其他语言的问题。

【问题讨论】:

  • 什么语言用于运行正则表达式? PHP 还是 JS?
  • 你可以访问 JS 中的 XRegExp 吗?你可以使用XRegExp('^(\\pLu\\pLl*\\s)+\\pLu\\pLl*$');
  • 你应该看看 unicodes:kourge.net/projects/regexp-unicode-block。例如:[\u0600-\u06FF]
  • @VictorStanciu 感谢您的精彩帖子,我只是想有像“Jean-Baptiste d'Artagnan”这样的名字,其中包括一些非字母字符。

标签: javascript php regex


【解决方案1】:

您可以通过使用Unicode Categories 来做到这一点。因此,正则表达式 ^\p{Lu}\p{Ll}+( \p{Lu}\p{Ll}+)*$ 将匹配一个大写字母,后跟一个或多个小写字母,后跟 0 个或多个其他名称,以空格分隔。表达式的示例显示为here

关于您的第二点,您可以使用^\p{Lu}\p{Ll}*$ 之类的东西,它需要至少 1 个大写字母后跟 0 个或多个小写字母。

上述表达式假定您的姓名中没有引号,例如O'Brian 或破折号Foo-bar。如果您想专门处理希腊名称,并且您知道希腊名称中既没有引号也没有破折号,那么这应该不是什么大问题。

通常只需确保提供的名称不为空,而不是指定某种严格的形式。有关此事的更多信息,请参阅this问题。

【讨论】:

  • 感谢您的回复。这看起来是迄今为止最好的解决方案。我现在遇到的问题是给定的正则表达式不适用于 JS。当我使用 JS 时,regex101.com 将 \p 理解为文字。你有什么想法吗?
  • @MerianosNikos:This 可能会有所帮助。话虽如此,我不建议您使用正则表达式来检查 valid 名称。
  • 这不允许中文和日文字符,因为它们属于LoLt 中也有一些希腊字符。
  • @nhahtdh:在这种情况下,我认为使用or 类似运算符和\p{Lo}+[\p{Lo} ]+ 应该可以工作。
【解决方案2】:
^[{\p{L}}{0-9}]$

此正则表达式匹配来自任何语言的任何类型的字母(以及数字)。

【讨论】:

    【解决方案3】:
    function isFullname($fullname) {
       return preg_match("/^((?:\p{Ll}|\p{Lu}){2,30}\s?){2,4}$/g", $fullname);
    }
    

    这对我很有用。因为用户名也可以小写。

    并且它可以有至少 2 个字符的名字或姓氏。此外,我接受最多 30 个字符的名称。我让它至少可重复 2 次,最多 4 次。

    它可能有一个像 McCésy 的名字(真的吗?=))...

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多