名和姓的正则表达式

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

对于第一个名字,它应该只包含字母,可以是几个带空格的单词,并且最少有三个字符,但是最多有30个字符。不应验证空字符串(例如,杰森JasonJason SmithJason SmithJASONJason SmithJason SmithJason SMITH)。

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

526734 次浏览

名字应该是

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

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

你的姓氏要求可以翻译成

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

但你应该看看这些,有很多姓都有空格。

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;
}

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

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

注意,它排除了所有的外国字母,如 é,è,à,ï。

如果希望对每个单词应用3到30个字符的限制,Jens regexp 将完成这项工作。

你对姓和名的格式做了错误的假设。除了检查名称是否为空之外,最好根本不要验证该名称。

不要忘记这样的名字:

  • Mathias d’Arras
  • 小马丁·路德·金。
  • 赫克托香肠豪森

对于大多数情况,这应该能够奏效:

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

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

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

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

在我的例子中,这个变量是 $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

我自己正在学习正则表达式,但是我有正则表达式伙伴提供的代码解释。
这就是:

在单词边界“ b”处断言位置

匹配下面的正则表达式并将其匹配捕获到反向引用号1中
([ 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}”

2到5倍,尽可能多的倍数,根据需要返回(贪婪)“{2,5}”

我需要一些帮助来理解这个笔记的分支

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

匹配下面的正则表达式(只有在这个方法失败时才尝试下一个替代方法)“[ A-Z ]{1}[ A-Z ]{1,30}[-]{0,1}”

在“ A”和“ Z”“[ A-Z ]{1}”之间的范围内匹配单个字符

正好1乘以“{1}”

在“ a”和“ z”“[ a-z ]{1,30}”之间的范围内匹配单个字符

在1到30倍之间,尽可能多的倍数,根据需要返回(贪婪)“{1,30}”

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

0到1次之间,尽可能多的次数,根据需要返回(贪婪)“{0,1}”

或者匹配下面的正则表达式2(只有在这个方法失败时才尝试下一个替代方法)“[ A-Z ]{1}[-’]{1}[ A-Z ]{0,1}[ A-Z ]{1,30}[-]{0,1}”

在“ A”和“ Z”“[ A-Z ]{1}”之间的范围内匹配单个字符

正好1乘以“{1}”

匹配“[-’]{1}”下面的列表中的单个字符

正好1乘以“{1}”

其中一个字母“-”“-”一个字母“”

在“ A”和“ Z”“[ A-Z ]{0,1}”之间的范围内匹配单个字符

0到1次之间,尽可能多的次数,根据需要返回(贪婪)“{0,1}”

在“ a”和“ z”“[ a-z ]{1,30}”之间的范围内匹配单个字符

在1到30倍之间,尽可能多的倍数,根据需要返回(贪婪)“{1,30}”

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

0到1次之间,尽可能多的次数,根据需要返回(贪婪)“{0,1}”

或者匹配下面的正则表达式编号3(如果该组不匹配,则整个组将失败)“[ A-Z ]{1,2}[-’]{1}[ A-Z ]{1}[ A-Z ]{1,30}”

在“ a”和“ z”“[ a-z ]{1,2}”之间的范围内匹配单个字符

在一到两倍之间,尽可能多的倍数,根据需要返回(贪婪)“{1,2}”

匹配“”和“’”“[-’]{1}”范围内的单个字符

正好1乘以“{1}”

在“ A”和“ Z”“[ A-Z ]{1}”之间的范围内匹配单个字符

正好1乘以“{1}”

在“ a”和“ z”“[ a-z ]{1,30}”之间的范围内匹配单个字符

在1到30倍之间,尽可能多的倍数,根据需要返回(贪婪)“{1,30}”

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

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

  1. 史蒂夫 · 史密斯(失败)
  2. 史蒂夫3史密斯(失败)
  3. 史蒂夫 · 史密斯(失败)
  4. 史蒂夫 · 史密斯(失败)
  5. 史蒂夫 · 史密斯(传给史蒂夫 · 史密斯)
  6. 小心谨慎(传递给小心谨慎)
  7. Jo Blow (通过)
  8. 洪敬武(合格)
  9. 麦克 · 奥尼尔(通过)
  10. 史蒂夫 · 约翰逊-史密斯(通过)
  11. 约瑟夫-施莫泽夫 · 海姆德尔(通过)
  12. 哦,亨利 · 史密斯(过世了)
  13. Mathais d’Arras (通过)
  14. 马丁·路德·金(通过)
  15. 市中心-詹姆斯布朗(通过)
  16. 达伦 · 麦卡蒂(通过)
  17. 乔治 · 德 · 芬克马斯特(通过)
  18. 篮球(传球)
  19. 艾哈迈德 · 杰夫(通过)

如果您有基本的名称,那么必须有一个以上到五个以上的名称才能使用上述代码,这些名称与我在测试期间使用的名称相似,这段代码可能适合您。

如果您有任何改进,请让我知道。我只是在早期阶段(最初几个月的计算出正则表达式。

谢谢,祝你好运, 史蒂夫

我用:

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

并使用其他方法测试最大长度

我就用这个。

这个正则表达式只接受来自 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,}

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

(.*)\s(.*)

我喜欢的是姓总是在名之后所以如果你要把这些匹配的组输入数据库名字是约翰 · M · 史密斯那么第一组就是 约翰 · M,第二组是史密斯。

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

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

正如马克所说:

不要忘记这样的名字:

Mathias d’Arras

小马丁·路德·金。

赫克托香肠豪森

并移除以下情况:

马赛厄斯

马丁 · 金二世

这将涵盖更多案件:

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

在 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');
?>

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

我已经尝试过这些类型的名字,并发现工作完美

  1. 约翰 · 史密斯
  2. John D’Largy
  3. John Doe-Smith
  4. John Doe Smith
  5. 赫克托香肠豪森
  6. Mathias d’Arras
  7. 马丁·路德·金
  8. 艾王
  9. 朝昌
  10. 阿尔兹贝塔芭拉

我的正则表格是这样的:

^([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 -)") ]

请注意转义字符的双 \\

对于那些刚接触正则表格的人,我想我应该加上一个解释。

^               // 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

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

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

支持字符:

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

我正在开发验证国际护照(ICAO)的应用程序。我们只支持英文字符。虽然大多数外国民族字符可以用拉丁字母表中的一个字符来表示,例如“ e”表示“ e”,但有几个民族字符需要一个额外的字母来表示它们,例如德国元音字母表需要在字母表中添加一个“ e”,例如“ ä”表示“ 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>

对于姓和名来说,你真正应该关注的只有两件事:

  1. 长度
  2. 内容

下面是我的正则表达式:

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

1. 长度

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

2. 内容

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

^\p{L}{2,}$

^ 在行首断言位置。

P { L }匹配来自任何语言的任何类型的字母

{2,}量化符ーー匹配在2和无限次之间,尽可能多的次数,根据需要返还(贪婪)

$断言行尾的位置

所以它应该是一个名字在任何语言包含至少2个字母(或符号)没有数字或其他字符。

下面的表达式将在 UTF-16支持的 任何语言上工作,并确保名称(即 first + last)有一个 最少两个组成部分,但是也允许任意数量的中间名。

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

在撰写本文时,似乎没有任何其他答案符合所有这些标准。即使是最接近的 ^\p{L}{2,}$也达不到要求,因为它还将匹配“不可见”字符,例如 U+FEFF(零宽度无中断空间)。

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

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>

只有一个空格的全名:

^[a-zA-Z'\-\pL]+(?:(?! {2})[a-zA-Z'\-\pL ])*[a-zA-Z'\-\pL]+$

这个正则表达式适合我(在角度8中使用) :

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

enter image description here

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

  1. 名称的开始或结束的任何空格
  2. 有符号,例如@
  3. 少于2个或多于30个

无效名字示例(空格)

enter image description here

有效名字示例:

enter image description here

这似乎对我有效:

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

如果您正在搜索一个最简单的方法,只检查近2个单词。

/^[^\s]+( [^\s]+)+$/

有效的名字

  • 无名氏
  • Pedro Alberto ch
  • 阿,将军
  • Mathias d’Arras
  • 小马丁·路德·金。

没有有效的名字

  • 约翰
  • 大文

这里有一个投票最多的答案,它推荐这个 regex:

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

它只将空格作为有效名称!

在我看来,最好的解决办法就是在开始的时候加上一个消极的预期:

^(?!\s)([a-z ,.'-]+)$/i

我已经尝试了这个页面上的几乎所有的东西,然后我决定修改投票最多的答案,结果是最好的。只需匹配所有语言,并包括 .,-' 字符。

这就是:

/^[\p{L} ,.'-]+$/u

阅读几乎所有被高度评价的帖子(只有一些是好的)。在详细了解了这个问题并做了研究之后,下面是一些严格的正则表达式:

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

  • 名称 Z允许与线程中某些人的假设相反。
  • 不允许使用前导空格或尾随空格,不允许使用空字符串,不允许只包含空格的字符串
  • 只支持英文字母
  • 支持连字符(Some-Foobarbaz-nameSome foobarbaz-Name) ,撇号(David D'CostaDavid D'costaDavid D'costa R'Costa p'costa) ,句号(Dr. L. JohnRobert Downey Jr.Md. K. P. Asif)和逗号(Martin Luther, Jr.)。
  • 名字的第一个单词的第一个字母必须是大写。
    不允许 : John sTeWaRTJOHN STEWARTMd. KP AsifJohn Stewart PhD
    允许 : John StewartJohn stewartMd. K P Asif
    您可以很容易地修改这个条件

如果您还希望允许像 Queen Elizabeth 2Henry IV这样的名称:
2) ^[A-Z][a-z]*(([,.] |[ '-])[A-Za-z][a-z]*)*([.]?| (-----)| [1-9][0-9]*)$

用罗马数字的正则表达式替换 -----(它本身很长)或者你可以使用这个基于 KISS 哲学的替代正则表达式 [IVXLCDM]+(这里是 IVX,... 任何随机顺序都可以满足正则表达式)。


我个人建议使用这个 regex:
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个正则表达式并不紧密,不像前面的那些,但是做得很好。这些正则表达式区分了名字的三个部分: 英文字母、空格和特殊字符。你需要从这4个问题中选择哪一个取决于你对这些问题的回答(是的/没有) :

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

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

我通常会写:

return /^[a-zA-Z\-\s\.\'\`\u00E0-\u00FC]+$/.test(firstName);

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

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

最终正则表达式 没有标点符号: [”][’][ ,][ . ]等:

^([^\p{N}\p{S}\p{C}\p{P}]{2,20})$

标点符号:

^([^\p{N}\p{S}\p{C}\\\/]{2,20})$

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

alex junior
沐宸
Nick
Sarah's Jane ---> with punctuation support
ביממה
حقیقت
Виктория

下列名称无效:

🤣 Maria
k
١١١١١
123John

这意味着所有没有数字字符,表情符号,并在2-20个字符之间的名称是允许的。如果要向排除列表中添加更多字符,可以编辑上述正则表达式。

要获得更多关于包含/排除可用模式的信息,请检查以下内容: Https://www.regular-expressions.info/unicode.html#prop