名字的正则表达式

Hel*_*nar 107 regex validation

出于网站验证的目的,我需要名字和姓氏验证.

对于名字,它应该只包含字母,可以是几个空格,没有字母,最少3个字符和前30个字符的单词.不应验证空字符串.即:

Jason,jason,jason smith,jason smith,JASON,Jason smith,jason Smith,jason SMITH

对于姓氏,它应该是一个单词,只有字母,至少3个字符和前30个字符.不应验证空字符串.IE:lazslo,Lazslo,LAZSLO

mač*_*ček 169

别忘了这样的名字:

  • Mathias d'Arras
  • 马丁路德金.
  • Hector Sausage-Hausen

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

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

或支持带有超甜蜜unicode的国际名称:

/^[a-zA-Zàáâäãå????èéêë??ìíîï??òóôöõøùúûü??ÿý??ñç?šžÀÁÂÄÃÅ?????ÈÉÊËÌÍÎÏ???ÒÓÔÖÕØÙÚÛÜ??ŸÝ??ÑßÇŒÆ?ŠŽ?ð ,.'-]+$/u

  • 那么`陈大文`在这里不是一个有效的名字吗? (61认同)
  • 您无法验证所有可能的国家字符.例如,匈牙利字符`ŐűŰŐűŰ`缺失,波兰字符`łŁ`,更不用说立陶宛和拉脱维亚的一些字符.而是试图找到一个库,将异国情调的角色转换为适当的无重音版本,然后写出`/ ^ [az,.'-] + $/i`正则表达式. (25认同)
  • @JoelPurra它已经被[](: (12认同)
  • 对于Unicode,使用`/ ^ [\ p {L}'] [\ p {L}' - ]*[\ p {L}] $/u`,但是非常宽容. (11认同)
  • AZ不需要包含在原始示例中,因为表达式后面的i修饰符意味着忽略大小写. (3认同)
  • 我使用这个,`^[\p{L} ,.'-]*$`,它也适用于 Unicode (3认同)
  • 那么“Иванов Иван Иванович”在这里不是一个有效的名字吗?您对名字和姓氏的格式做出了错误的假设。除了检查名称是否为空之外,最好根本不验证该名称。 (3认同)
  • macek,您缺少相当多的字符来支持甚至常见的使用拉丁语的语言(例如波兰语)。这进一步表明,所有的努力都是徒劳的。 (2认同)
  • 我会在这些正则表达式中逃避[特殊字符](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp#Special_characters_in_regular_expressions) - 尤其是`.`(小数点/点/满停止)因为它是regexp通配符=) (2认同)

Sjo*_*erd 72

您对名字和姓氏的格式做出错误的假设.除了检查它是否为空之外,最好不要验证名称.

  • 应该是一个评论。 (11认同)
  • 这是唯一理智的答案。另请参阅 https://www.kalzumeus.com/2010/06/17/falsehoods-programmers- believe-about-names/ 。 (2认同)
  • 如果您不进行验证,请小心 JavaScript 或 HTML 注入攻击。 (2认同)
  • 但是名称中不能包含数字或符号,可以吗?毕竟我们想要一个“名称”而不是“@用户名”。 (2认同)

Cri*_*ero 24

在完成所有这些答案之后,我找到了一种方法来构建一个支持大多数语言的小型正则表达式,并且只允许单词字符.它甚至支持一些特殊字符,如连字符,空格和撇号.我在python中测试过它支持下面的字符:

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

支持的字符:

abcdefghijklmnopqrstwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
áéíóúäëïöüÄ'
???
??????Zàáâäãå????èéêë??ìíîï??òóôöõøùúûü??
ÿý??ñç?šžÀÁÂÄÃÅ?????ÈÉÊËÌÍÎÏ??
?ÒÓÔÖÕØÙÚÛÜ??ŸÝ??ÑßÇŒÆ?ŠŽ.-
ñÑâê?????????????
????????? ?????? ??
Run Code Online (Sandbox Code Playgroud)

  • 您的正则表达式在 2 个字符串上失败。我认为这修复了它 `^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&amp;*(){}|~&lt;&gt;;:[\ ]]*$` (3认同)
  • 在所有答案中,这个使用ng 4就像是一种魅力。 (2认同)
  • 支持国家字符,但不支持第一个位置。我将表达式更改为 `^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&amp;*(){}|~&lt;&gt;;:[\]]{2,}$` (2认同)
  • 我们在奥地利有一个共同的姓氏 Österreicher,但它是无效的。另外,根据 regex101.com,正斜杠需要转义。我不能推荐这个... (2认同)
  • 那么表情符号有效吗? (2认同)

Ste*_*zey 15

我已经搜索,搜索,播放和播放它虽然不完美,但它可以帮助其他人尝试验证作为一个变量提供的名字和姓氏.

就我而言,该变量是$ 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
Run Code Online (Sandbox Code Playgroud)

我自己在学习RegEx,但我确实对RegEx buddy提供的代码有解释.
这里是:

在字边界处断言位置«\ 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}»

匹配列表中的单个字符" - "«[ - ] {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}»

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

在零和一次之间,尽可能多次,根据需要回馈(贪婪)«{0,1}»

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

匹配"a"和"z"«[az] {1,2}之间范围内的单个字符»

根据需要尽可能多地回馈一到两次(贪婪)«{1,2}»

匹配""和"'"«[ - \'] {1}之间范围内的单个字符»

正好1次«{1}»

匹配"A"和"Z"«[AZ] {1}之间范围内的单个字符

正好1次«{1}»

匹配"a"和"z"«[az] {1,30}之间范围内的单个字符»

根据需要尽可能多次回馈(贪婪)«1,30}»

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

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

  1. 史蒂夫史密斯(失败)
  2. 史蒂夫史密斯(失败)
  3. STeve Smith(失败)
  4. 史蒂夫史密斯(失败)
  5. Steve Sm1th(传递给Steve Sm)
  6. d'Are to Beaware(传递给Are to Beaware)
  7. 乔布洛(通过)
  8. Hyoung Kyoung Wu(通过)
  9. 迈克奥尼尔(通过)
  10. 史蒂夫约翰逊史密斯(通过)
  11. Jozef-Schmozev Hiemdel(通过)
  12. 欧亨利史密斯(通过)
  13. Mathais d'Arras(通过)
  14. 小马丁路德金(通过)
  15. 市中心 - 詹姆斯布朗(通过)
  16. Darren McCarty(通过)
  17. George De FunkMaster(通过)
  18. Kurtis B-Ball篮球(通过)
  19. Ahmad el Jeffe(通过)

如果您有基本名称,则上述代码必须有多于五个,这与我在测试期间使用的类似,此代码可能适合您.

如果您有任何改进,请告诉我.我刚刚处于早期阶段(最初几个月找出RegEx.

谢谢,祝你好运,史蒂夫

  • 不适用于“Björk Guðmundsdóttir” (3认同)

小智 14

今天是个好日子.

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

我尝试了这些类型的名字,发现工作完美

1)John Smith
2)John D'Largy
3)John Doe-Smith
4)John Doe Smith
5)Hector Sausage-Hausen
6)Mathias d'Arras
7)Martin Luther King
8)Ai Wong
9)Chao Chang
10)Alzbeta Bara

我的RegEx看起来像这样:

^([a-zA-Z]{2,}\s[a-zA-z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)
Run Code Online (Sandbox Code Playgroud)

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 -)") ]
Run Code Online (Sandbox Code Playgroud)

请注意双\\for escape charactors

对于那些不熟悉RegEx的人,我想我会包含一个解释.
^ (行的开头)
[a-zA-Z] {2,} (除了具有至少两个字符的名称)
\ s (将查找名称和姓氏之间的空格)
[a-zA-Z] {1 ,} (至少需要1个字符)
'? - ? ('-对于双管和带连字符的姓氏的可能性)
[a-zA-Z] {2,} (除了至少有两个字符的名字)
\ s? (另一个空格的可能性)
([a-zA-Z] {1,})?*(第二姓的可能性)<*br />

希望这对您的项目有所帮助.
亲切的问候
Francois Muller


Jen*_*ens 10

名字是

"([a-zA-Z]{3,30}\s*)+"
Run Code Online (Sandbox Code Playgroud)

如果你需要整个名字部分短于30个字母,我认为你需要单独检查.表达式".{3,30}"应该这样做.

您的姓氏要求将转化为

"[a-zA-Z]{3,30}"
Run Code Online (Sandbox Code Playgroud)

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

  • _O'Connor_呢?撇号也需要包括在内。 (2认同)
  • “阿尔”呢?有效的名字。只有两个字母。中文、俄语、印地语名字又如何呢?那么欧洲名字呢? (2认同)

Sno*_*ses 8

这个正则表达式对我有用(在 Angular 8 中使用):

([a-zA-Z',.-]+( [a-zA-Z',.-]+)*){2,30}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果有以下情况,则无效:-

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

示例无效名字(空格)

在此处输入图片说明

示例有效名字:

在此处输入图片说明

  • “Björk Guðmundsdóttir”怎么样? (6认同)

Asi*_*K T 7

正如马塞克所说:

别忘了这样的名字:

Mathias d'Arras

马丁路德金.

Hector Sausage-Hausen

并删除像:

..Mathias

小马丁,小 -

这将涵盖更多案例:

^([a-z]+[,.]?[ ]?|[a-z]+['-]?)+$
Run Code Online (Sandbox Code Playgroud)

  • 是的,马丁·路德·金作为一场比赛回归,亨利八世也是如此。 (2认同)

Ama*_*ara 7

阅读几乎所有高投票的帖子(只有一些是好的)。在详细了解问题并进行研究后,以下是严格的正则表达式:

1)。^[A-Z][a-z]*(([,.] |[ '-])[A-Za-z][a-z]*)*(\.?)$

  • Z与线程中某些人所做的假设相反,名称是允许的。
  • 不允许前导或尾随空格,不允许空字符串,不允许仅包含空格的字符串
  • 仅支持英文字母
  • 支持连字符(Some-Foobarbaz-name, Some foobarbaz-Name)、撇号(David D'Costa, David D'costa, David D'costa R'Costa p'costa)、句点(Dr. L. John, Robert Downey Jr., Md. K. P. Asif)和逗号(Martin Luther, Jr.)。
  • 仅名称的第一个单词的第一个字母必须大写。
    不允许John sTeWaRT,,,允许: ,,您JOHN STEWART可以轻松修改此条件Md. KP AsifJohn Stewart PhD
    John StewartJohn stewartMd. K P Asif

如果您还想允许使用类似Queen Elizabeth 2或 的名称Henry IV
2)。^[A-Z][a-z]*(([,.] |[ '-])[A-Za-z][a-z]*)*([.]?| (-----)| [1-9][0-9]*)$

替换-----为罗马数字的正则表达式(其本身很长),或者您可以使用基于 KISS 哲学的替代正则表达式[IVXLCDM]+(此处I, V, X, ... 以任何随机顺序都将满足正则表达式)。


我个人建议使用这个正则表达式:
3)。请随意在此处^[A-Z][a-z]*(([,.] |[ '-])[A-Za-z][a-z]*)*(\.?)( [IVXLCDM]+)?$
尝试此正则表达式并根据您的选择进行任何修改。

我提供了严格的正则表达式,它涵盖了我在研究中发现的所有可能的名称,没有错误。修改这些正则表达式以放宽一些不需要的限制。


[更新 - 2022 年 3 月]

这里还有 4 个正则表达式:

^[A-Za-z]+(([,.] |[ '-])[A-Za-z]+)*([.,'-]?)$

^((([,.'-]| )(?<!( {2}|[,.'-]{2})))*[A-Za-z]+)+[,.'-]?$

^( ([A-Za-z,.'-]+|$))+|([A-Za-z,.'-]+( |$))+$

^(([ ,.'-](?<!( {2}|[,.'-]{2})))*[A-Za-z])+[ ,.'-]?$

自从我回顾这 4 个正则表达式以来已经有一段时间了,所以我忘记了它们的规格。与前面的不同,这 4 个正则表达式并不严格,但可以很好地完成工作。这些正则表达式区分名称的 3 个部分:英文字母、空格和特殊字符。您需要这 4 个中的哪一个取决于您对以下问题的回答(/):

  1. 至少有 1 个字母?
  2. 可以以空格或特殊字符开头吗?
  3. 可以以空格或特殊字符结尾吗?
  4. 是否允许有 2 个连续空格?
  5. 是否允许使用 2 个连续的特殊字符?

注意:名称验证应该仅作为警告,而不是名称应该满足的必要条件,因为没有固定的命名模式,如果有的话,它可以在一夜之间改变,因此,您遇到的任何严格的正则表达式都将在将来的某个地方变得过时。


Ami*_*n3t 7

我没有发现任何对我有用的答案,因为用户可以选择非英语名称,而简单的正则表达式没有帮助。事实上,找到适用于所有语言的正确表达方式实际上非常困难。

\n

相反,我选择了一种不同的方法,并否定了所有不应该出现在有效匹配名称中的字符。下面的模式否定数字、特殊字符、控制字符和\'\\\'、\'/\'

\n

最终正则表达式\n不带标点符号:["] [\'] [,] [.] 等:

\n
^([^\\p{N}\\p{S}\\p{C}\\p{P}]{2,20})$\n
Run Code Online (Sandbox Code Playgroud)\n

带标点符号:

\n
^([^\\p{N}\\p{S}\\p{C}\\\\\\/]{2,20})$\n
Run Code Online (Sandbox Code Playgroud)\n

这样,所有这些名称都是有效的:

\n
alex junior\n\xe6\xb2\x90\xe5\xae\xb8\nNick\nSarah\'s Jane ---> with punctuation support\n\xd7\x91\xd7\x99\xd7\x9e\xd7\x9e\xd7\x94\n\xd8\xad\xd9\x82\xdb\x8c\xd9\x82\xd8\xaa\n\xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80\xd0\xb8\xd1\x8f\n
Run Code Online (Sandbox Code Playgroud)\n

并且以下名称无效:

\n
 Maria\nk\n\xd9\xa1\xd9\xa1\xd9\xa1\xd9\xa1\xd9\xa1\n123John\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着所有不包含数字字符、表情符号、\\ 且长度在 2-20 个字符之间的名称都是允许的。如果您想向排除列表添加更多字符,您可以编辑上述正则表达式。

\n

要获取有关要包含/排除的可用模式的更多信息,请查看以下内容:\n https://www.regular-expressions.info/unicode.html#prop

\n

  • 谢谢 !我将继续测试不带标点符号的正则表达式,看起来很棒 (2认同)

Rez*_*Net 6

这里投票最高的答案有一个问题,推荐使用这个正则表达式:

/^[a-z ,.'-]+$/i
Run Code Online (Sandbox Code Playgroud)

它只需要空格作为有效名称!

我认为最好的解决方案是在开头添加负面期待:

/^(?!\s)([a-z ,.'-]+)$/i
Run Code Online (Sandbox Code Playgroud)


mal*_*lix 5

我用:

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

并使用其他方法测试 maxlength


ege*_*ter 5

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

(.*)\s(.*)
Run Code Online (Sandbox Code Playgroud)

我喜欢的是,姓氏总是在第一个名字之后,所以如果您要将这些匹配的组输入数据库,名称是John M. Smith,那么第一组将是John M. ,第二组将是史密斯.


Ale*_*ych 5

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

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

/^[a-zA-Z '.-]*$/
Run Code Online (Sandbox Code Playgroud)

国际护照上的最大字符数为31。我们使用maxlength =“ 31”来更好地显示错误消息,而不是将其包含在正则表达式中。

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

/^[a-zA-Z '.-]*$/
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
 
.has-error p[ng-message] {
  color: #bc111e;
}

.tip {
  color: #535f67;
}
Run Code Online (Sandbox Code Playgroud)


pab*_*rsk 5

最简单的方法。只需检查近2个字。

/^[^\s]+( [^\s]+)+$/
Run Code Online (Sandbox Code Playgroud)

有效名称

  • 约翰·多伊
  • 佩德罗·阿尔贝托·赫
  • 阿尔。创
  • 马蒂亚斯·达拉斯
  • 马丁路德金。

没有有效名称

  • 约翰
  • ???


Joh*_*oga 5

我已经尝试了此页面上的几乎所有内容,然后我决定修改最终效果最佳的投票最多的答案。只需匹配所有语言并包含.,-' 字符。

这里是:

/^[\p{L} ,.'-]+$/u
Run Code Online (Sandbox Code Playgroud)

  • 可能是这里最有感觉的答案。此正则表达式将仅阻止数字,但会适应各种名称格式。但是,如果您关心 Internet Explorer 11,则该浏览器使用 unicode Regex 原型,该原型在旧浏览器中不可用 (2认同)
  • 您可以通过禁止单字母名称 `^[\p{L} ,.'-]{2.}$` 来改进这一点。所以“Jo”可以,但“J”不行。 (2认同)