名字和姓氏的正则表达式


124

为了进行网站验证,我需要验证名字和姓氏。

对于名字,它只能包含字母,可以是几个带空格的单词,并且至少三个字符,最大30个字符。不应验证空字符串(例如Jasonjasonjason smithjason smithJASONJason smithjason Smithjason SMITH)。

对于姓氏,它应该是一个单词,只有字母,至少三个字符,但最多30个字符。空字符串不应该被验证(例如lazsloLazsloLAZSLO)。


10
那么“ Jo”这样的名字呢?
2010年

6
只是一句话:连字符在姓氏中很常见...也许姓氏中也有空格
tanascius 2010年

2
注意:regularexpressionvalidator将忽略空输入:这可能是您想要的,也可能不是。
汉斯·基辛

4
如果可能的话,除非您有令人信服的理由要求输入名字和姓氏,否则只需提供一个“名称”字段即可。kalzumeus.com/2010/06/17/…–
克里斯(Chris

Answers:


195

不要忘了像这样的名字:

  • Mathias d'Arras
  • 马丁路德金。
  • 赫克托香肠-豪森

这应该可以解决大多数问题:

/^[a-z ,.'-]+$/i

或使用超级可爱的Unicode支持国际名称:

/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.'-]+$/u


4
我会转义这些正则表达式中的特殊字符 -特别是.(小数点/点/句号),因为它是正则表达式通配符=)
Joel Purra 2012年

30
您无法验证所有可能的国家字符。例如őŐűŰ,缺少匈牙利字符,也缺少波兰字符łŁ,更不用说一些立陶宛和拉脱维亚字符。而是尝试找到一个将外来字符转换为适当的无重音版本的库,然后编写正则/^[a-z ,.'-]+$/i表达式。
gaborsch

69
那这里陳大文不是有效的名字吗?
Alvin Wong

16
对于Unicode,请使用/^[\p{L}'][ \p{L}'-]*[\p{L}]$/u,但是相当宽容。
Frederik Krautwald 2014年

4
AZ不必包含在原始示例中,因为表达式后的i修饰符表示忽略大小写。
mhanney

73

您对名字和姓氏的格式进行了错误的假设。除了检查名称是否为空之外,最好不要完全验证名称。


应该是一个评论。
痴呆

32

经过所有这些答案之后,我找到了一种构建微型正则表达式的方法,该正则表达式支持大多数语言,并且仅允许单词字符。它甚至支持一些特殊字符,例如连字符,空格和撇号。我已经在python中测试过,它支持以下字符:

^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$

支持的字符:

abcdefghijklmnopqrstwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
áéíóúäëïöüÄ'
陳大文
łŁőŐűŰZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųū
ÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁ
ŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ.-
ñÑâê都道府県Федерации
আবাসযোগ্য জমির걸쳐 있는

2
出所有的答案这个工作就像使用纳克4.魅力
Deniss M.

1
您的正则表达式在2个字符的字符串上失败。我认为这已解决^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]*$
-TKA

支持使用国家字符,但不能放在第一位。我将表情更改为^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
TOUDIdel '19

18

我创建了一个自定义正则表达式来处理名称:

我已经尝试过这些类型的名称,并发现可以正常工作

  1. 约翰·史密斯
  2. 约翰·达吉
  3. 约翰·杜·史密斯
  4. 约翰·杜·史密斯
  5. 赫克托香肠-豪森
  6. Mathias d'Arras
  7. 马丁·路德·金
  8. 黄爱
  9. 潮昌
  10. Alzbeta Bara

我的RegEx看起来像这样:

^([a-zA-Z]{2,}\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)

MVC4型号:

[RegularExpression("^([a-zA-Z]{2,}\\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\\s?([a-zA-Z]{1,})?)", ErrorMessage = "Valid Charactors include (A-Z) (a-z) (' space -)") ]

请注意\\转义字符的双精度

对于RegEx新手,我想我会附上解释。

^               // start of line
[a-zA-Z]{2,}    // will except a name with at least two characters
\s              // will look for white space between name and surname
[a-zA-Z]{1,}    // needs at least 1 Character
\'?-?           // possibility of **'** or **-** for double barreled and hyphenated surnames
[a-zA-Z]{2,}    // will except a name with at least two characters
\s?             // possibility of another whitespace
([a-zA-Z]{1,})? // possibility of a second surname

我有一个单元测试,它测试几个名称,然后测试几个不是名称的东西。“非名称”列表的第一项为“测试令牌”。这匹配。
罗布(Rob)

这几乎是我在寻找的东西。我猜(也许是错误的)你是法国人。还有一种情况不是您可以用法语遇到的句柄:组合名称,例如Jean-Pierre,Marie-Charlotte等...我是reg exp的新手,但我猜是-?就像您为姓氏所做的那样,可以在两个单词之间完成这项工作。
林普特18'Feb 28'18

嗨,Linpter,不是法国人,但是我确实有一个法国名字。是。我尚未对此进行测试,但是您应该可以在第一个[]中添加-,因此请更改:^([a-zA-Z] {2,} \ s [a-zA-z] {1,}' ?-?[a-zA-Z] {2,} \ s?([a-zA-Z] {1,})?)TO:^([a-zA-Z-] {2,} \ s [a-zA-z] {1,}'?-?[a-zA-Z] {2,}?s(([a-zA-Z] {1,})?)
弗朗索瓦·穆勒(

16

我进行了搜索,搜索和使用,虽然它并不完美,但它可能会帮助其他人尝试验证作为一个变量提供的名字和姓氏。

就我而言,该变量为$ name。

我将以下代码用于PHP:

    if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}  
    [a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)  
    # there is no space line break between in the above "if statement", any that   
    # you notice or perceive are only there for formatting purposes.  
    # 
    # pass - successful match - do something
    } else {
    # fail - unsuccessful match - do something

我自己在学习RegEx,但确实有RegEx好友提供的代码说明。
这里是:

在单词边界«\ b»处声明位置

匹配下面的正则表达式,并将其匹配捕获到后向引用数1
«([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [-\'] { 1} [AZ] {0,1} [az] {1,30} [-] {0,1} | [az] {1,2} [-\'] {1} [AZ] {1} [ az] {1,30}){2,5}»

在2到5次之间(尽可能多地),根据需要进行回馈(贪婪)«{2,5}»

*我需要一些帮助来理解本注释的内容 *

注意:我重复了捕获组本身。该组将仅捕获最后一次迭代。将捕获组放在重复的组周围以捕获所有迭代。«{2,5}»

匹配下面的任何一个正则表达式(仅当该正则表达式失败时才尝试下一个替代)«[AZ] {1} [az] {1,30} [-] {0,1}»

匹配“ A”和“ Z”之间的单个字符«[AZ] {1}»

恰好是1次“ {{1}»”

匹配“ a”和“ z”之间的单个字符«[az] {1,30}»

在1到30次之间(尽可能多地),根据需要进行回馈(贪婪)«{1,30}»

匹配列表“-”«[-] {0,1}»中的单个字符

在零到一遍之间,尽可能多地遍历,并根据需要返回(贪婪)«{0,1}»

或匹配下面的第2个正则表达式(仅在失败时尝试下一个替代方法)«[AZ] {1} [-\'] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1}»

匹配“ A”和“ Z”之间的单个字符«[AZ] {1}»

恰好是1次“ {{1}»”

匹配«[-\'] {1}»下面的列表中存在的单个字符

恰好是1次“ {{1}»”

字符“-”,“-”,“ A”字符“ \”»之一

在“ A”和“ Z”之间匹配一个字符«[AZ] {0,1}»

在零到一遍之间,尽可能多地遍历,并根据需要返回(贪婪)«{0,1}»

匹配“ a”和“ z”之间的单个字符«[az] {1,30}»

在1到30次之间(尽可能多地),根据需要进行回馈(贪婪)«{1,30}»

匹配列表“-”«[-] {0,1}»中的单个字符

在零到一遍之间,尽可能多地遍历,并根据需要返回(贪婪)«{0,1}»

或匹配下面的第3个正则表达式(如果该组不匹配,则整个组都将失败)«[az] {1,2} [-\'] {1} [AZ] {1} [az] {1,30} »

匹配“ a”和“ z”之间的单个字符«[az] {1,2}»

在1-2次之间,尽可能多地进行,根据需要进行回馈(贪婪)«{1,2}»

匹配“”和“'”«[-\'] {1}»之间的单个字符

恰好是1次“ {{1}»”

匹配“ A”和“ Z”之间的单个字符«[AZ] {1}»

恰好是1次“ {{1}»”

匹配“ a”和“ z”之间的单个字符«[az] {1,30}»

在1到30次之间(尽可能多地),根据需要进行回馈(贪婪)«{1,30}»

我知道此验证完全假设每个填写表格的人都有西方名字,这可能会消灭世界上绝大多数人。但是,我觉得这是朝着正确方向迈出的一步。也许这个正则表达式对于专家来说太简单了,无法简单地解决,或者还有其他一些原因使我无法在搜索中找到上述代码。我花了很长时间试图弄清楚这一点,如果您看下面的测试名称,您可能会注意到我对这一切的迷惑。

我在以下名称上测试了代码,结果在每个名称右侧的括号中。

  1. 史蒂夫·史密斯(失败)
  2. Stev3 Smith(失败)
  3. 史蒂夫·史密斯(失败)
  4. 史蒂夫·史密斯(失败)
  5. 史蒂夫·史密斯(传递史蒂夫·史密斯)
  6. d'Are to Beaware(传递给Are beaware)
  7. 乔·布洛(通过)
  8. 孝敬武(已通过)
  9. 迈克·奥尼尔(已通过)
  10. 史蒂夫·约翰逊·史密斯(通过)
  11. Jozef-Schmozev Hiemdel(通过)
  12. O Henry Smith(已通过)
  13. Mathais d'Arras(通过)
  14. 小马丁·路德·金(已通过)
  15. 詹姆斯·布朗市区(已通过)
  16. 达伦·麦卡蒂(通过)
  17. 乔治·德·芬克大师(通过)
  18. Kurtis B球篮球(通过)
  19. 艾哈迈德·杰弗(Ahmad el Jeffe)(通过)

如果您有基本名称,则上面的代码必须有不超过五个(最多五个)才能起作用,这些名称与我在测试过程中使用的相似,该代码可能适合您。

如果您有任何改进,请告诉我。我还处于初期阶段(弄清楚RegEx的头几个月。

谢谢,祝你好运,史蒂夫


1
像“第四”或“第四”这样的东西会起作用吗?
majidarif

11

名字是

"([a-zA-Z]{3,30}\s*)+"

我认为,如果您需要将整个名字部分短于30个字母,则需要单独检查。表达方式".{3,30}"应该做到这一点。

您的姓氏要求将转化为

"[a-zA-Z]{3,30}"

但您应该检查这些。有很多姓氏包含空格。


这是否检查之间的空间?
2014年

2
奥康纳呢?撇号也需要包括在内。
太空人2014年

1
相当不完整。名字可以是带有连字符的“ Jean-Claude”。姓氏可以是带有引号的“ D'arc”。另外,如果“François”是名字怎么办?
巴特

1
那“ Al”呢?有效的名字。只需两个字母。中文,俄语,印地语名字呢?欧洲名字呢?
Christian Hujer '16

这对于许多非英语或(非拉丁语)名称都不会起作用
老男孩

7

正如maček所说:

不要忘了像这样的名字:

Mathias d'Arras

马丁路德金。

赫克托香肠-豪森

并删除类似的情况:

..Mathias

小马丁·金-

这将涵盖更多情况:

^([a-z]+[,.]?[ ]?|[a-z]+['-]?)+$

如果我想限制字符长度,那么该代码是什么?
G.Abhisek '16

1
是的,小马丁·路德·金(Martin Luther King Jr.)返回比赛,第八名亨利国王(Henry King)也是如此。
史蒂夫·金泽

7

我正在开发可验证国际护照(ICAO)的应用程序。我们仅支持英文字符。虽然大多数外来国家字符可以用拉丁字母中的字符表示,例如èby e,但有些国家字符需要一个额外的字母来表示它们,例如德国变音符号,要求在字母上添加“ e”例如äby ae。

这是我们使用的名字和姓氏的JavaScript正则表达式:

/^[a-zA-Z '.-]*$/

国际护照上的最大字符数为31。我们使用maxlength =“ 31”来改善单词错误消息,而不是将其包括在正则表达式中。

这是AngularJS 1.6中的代码片段,其中包含表单和错误处理:

class PassportController {
  constructor() {
    this.details = {};
    // English letters, spaces and the following symbols ' - . are allowed
    // Max length determined by ng-maxlength for better error messaging
    this.nameRegex = /^[a-zA-Z '.-]*$/;
  }
}

angular.module('akyc', ['ngMessages'])
  .controller('PassportController', PassportController);
 
.has-error p[ng-message] {
  color: #bc111e;
}

.tip {
  color: #535f67;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.6/angular-messages.min.js"></script>

<main ng-app="akyc" ng-controller="PassportController as $ctrl">
  <form name="$ctrl.form">

    <div name="lastName" ng-class="{ 'has-error': $ctrl.form.lastName.$invalid} ">
        <label for="pp-last-name">Surname</label>
        <div class="tip">Exactly as it appears on your passport</div>
        <div ng-messages="$ctrl.form.lastName.$error" ng-if="$ctrl.form.$submitted" id="last-name-error">
          <p ng-message="required">Please enter your last name</p>
          <p ng-message="maxlength">This field can be at most 31 characters long</p>
          <p ng-message="pattern">Only English letters, spaces and the following symbols ' - . are allowed</p>
        </div>
        
        <input type="text" id="pp-last-name" ng-model="$ctrl.details.lastName" name="lastName"
               class="form-control" required ng-pattern="$ctrl.nameRegex" ng-maxlength="31" aria-describedby="last-name-error" />
      </div>

      <button type="submit" class="btn btn-primary">Test</button>

  </form>
</main>


@danieltakeshi您没有使用我的Regex。使用这个:/ ^ [a-zA-Z'.-] * $ /
Alexander Burakevych

5

我用:

/^(?:[\u00c0-\u01ffa-zA-Z'-]){2,}(?:\s[\u00c0-\u01ffa-zA-Z'-]{2,})+$/i

并使用其他方法测试maxlength


5

此正则表达式为我工作(在Angular 8中使用):

([a-zA-Z',.-]+( [a-zA-Z',.-]+)*){2,30}

在此处输入图片说明

如果存在以下情况,它将是无效的:

  1. 名称的任何空格开头或结尾
  2. 有符号,例如@
  3. 小于2或大于30

示例无效的名字(空格)

在此处输入图片说明

有效名字示例:

在此处输入图片说明


6
那“BjörkGuðmundsdóttir”呢?
Mariusz Jamro

4

为简单起见,您可以使用:

(.*)\s(.*)

我喜欢的是姓氏总是在名字之后,因此如果您要将匹配的组输入数据库,并且名称是John M. Smith,则第一个组将是JohnM。 ,第二组将是史密斯。


2
^\p{L}{2,}$

^声明行首的位置。

\ p {L}匹配来自任何语言的任何字母

{2,}量词-匹配2次和无限次,尽可能多地匹配,并根据需要返回(贪婪)

$在行尾声明位置

因此,该名称应为任何语言的名称,至少包含2个字母(或符号),且不包含数字或其他字符。


请记住,某些字符(例如'和-)在名称中有效。
Mathijs Segers,

1

因此,与客户一起,我们创建了这个疯狂的正则表达式:

(^$)|(^([^\-!#\$%&\(\)\*,\./:;\?@\[\\\]_\{\|\}¨ˇ“”€\+<=>§°\d\s¤®™©]| )+$)

1

对于名字和姓氏,实际上您只需要寻找两件事:

  1. 长度
  2. 内容

这是我的正则表达式:

var regex = /^[A-Za-z-,]{3,20}?=.*\d)/

1.长度

这里的{3,20}将字符串的长度限制在3到20个字符之间。

2.内容

方括号[A-Za-z]之间的信息允许使用大写和小写字符。也允许所有后续符号(-,.)。


1

这就是我用的。

此正则表达式仅接受带有最小字符的名称A-Z a-z ,space and -

名称示例:

Ionut Ionete, Ionut-Ionete Cantemir, Ionete Ionut-Cantemirm Ionut-Cantemir Ionete-Second

名称的字符数限制为3。如果要更改此名称,请将{3,}修改为{6,}

([a-zA-Z\-]+){3,}\s+([a-zA-Z\-]+){3,}

2
äåöÅÅÖ等如何?在瑞典语名称中非常常见。奥康纳(O'Conner)的姓氏也会失败,双桶名也会出现问题。对于拥有这样有效名称的人来说,这将非常令人沮丧。
2015年

O'Connor之类的名字中的撇号呢?
Fogmeister 2015年

我的表情返回了迈克尔·乔丹·奥赖利(Michael Jordan O'Reilly Jr.)作为有效名称
史蒂夫·金泽

0

以下表达式可在UTF-16支持的任何语言上运行,并确保名称中至少包含两个组成部分(即first + last),但也将允许任意数量的中间名。

/^(\S+ )+\S+$/u

在撰写本文时,似乎没有其他答案可以满足所有这些标准。甚至^\p{L}{2,}$最接近的偶数也不足,因为它也将匹配“不可见”字符,例如U+FEFF(零宽度无间断空格)。


没有通过regexr.com的 javascript 1)警告并非所有浏览器都支持unicode功能。2)它也在正则表达式中允许数字。例如:michael dimmittsasd2123123
Michael Dimmitt

0

尝试这些解决方案,以获得最大的兼容性,正如我已经在此处发布的:

JavaScript:

var nm_re = /^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$/;

HTML5:

<input type="text" name="full_name" id="full_name" pattern="^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$" required>


0

这似乎为我做的工作:

[\S]{2,} [\S]{2,}( [\S]{2,})*

-1

在PHP中使用preg_match的简单函数

<?php
function name_validation($name) {
    if (!preg_match("/^[a-zA-Z ]*$/", $name) === false) {
        echo "$name is a valid name";
    } else {
        echo "$name is not a valid name";
    }
}

//Test
name_validation('89name');
?>


-2

如果您希望整个名字在3到30个字符之间,并且对单个单词没有限制,请尝试以下操作:

[a-zA-Z ]{3,30}

请注意,它不包括é,è,à,ï的所有外国字母。

如果您希望每个单词使用3到30个字符的限制,则Jens regexp将完成此工作。


-2
var name = document.getElementById('login_name').value; 
if ( name.length < 4  && name.length > 30 )
{
    alert ( 'Name length is mismatch ' ) ;
} 


var pattern = new RegExp("^[a-z\.0-9 ]+$");
var return_value = var pattern.exec(name);
if ( return_value == null )
{
    alert ( "Please give valid Name");
    return false; 
} 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.