姓名の正規表現


124

ウェブサイトの検証のために、名と姓の検証が必要です。

名の場合は、文字のみを含める必要があり、スペースを含む複数の単語を使用できます。また、3文字以上、最大30文字まで使用できます。空の文字列は検証しないでください(例:Jasonjasonjason smithjason smithJASONJason smithjason Smith、およびjason SMITH)。

姓の場合は、3文字以上30文字以下の単一の単語、文字のみにする必要があります。空の文字列は検証しないでください(たとえば、lazsloLazslo、およびLAZSLO)。


10
「Jo」のような名はどうですか?
a'r

6
備考:

2
注:regularexpressionvalidatorは空の入力を無視します。これは必要な場合とそうでない場合があります。
Hans Ke st ing

4
可能であれば、姓と名を要求する驚くほど説得力のある理由がない限り、単一の「名前」フィールドを指定してください。kalzumeus.com/2010/06/17/...
クリス・

1

回答:


195

次のような名前を忘れないでください。

  • マティアス・ダラス
  • マーティン・ルーサー・キング・ジュニア。
  • ヘクターソーセージハウゼン

これはほとんどのことでうまくいくはずです:

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

または超甘いユニコードで国際名をサポート:

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


4
私はこれらの正規表現で特殊文字をエスケープします-特に.(小数点/ドット/フルストップ)正規表現のワイルドカードだからです。)
Joel Purra

30
すべての可能な国別文字を検証することはできません。たとえば、ハンガリー語の文字őŐűŰ、ポーランド語の文字łŁ、さらにはリトアニア語とラトビア語の文字が欠けています。むしろ、エキゾチックなキャラクターを適切なアクセントのないバージョンに変換するライブラリを見つけて、/^[a-z ,.'-]+$/i正規表現を記述してください。
gaborsch 2013年

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
すべての回答のうち、これはng 4を使用して魅力的に機能しました
Deniss M.

1
あなたの正規表現は2文字の文字列で失敗します。これで問題は解決したと思います^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]*$
TKA

国別文字はサポートされていますが、最初の位置にはありません。表現を次のように変更します^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
TOUDIdel

18

名前を処理するカスタム正規表現を作成しました。

私はこれらのタイプの名前を試してみて、完璧に機能していることがわかりました

  1. ジョンスミス
  2. ジョン・ダージ
  3. ジョン・ドスミス
  4. ジョン・ドウ・スミス
  5. ヘクターソーセージハウゼン
  6. マティアス・ダラス
  7. マーティン・ルーサー・キング
  8. アイウォン
  9. チャオチャン
  10. アルズベータバラ

私の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

それはほとんど私が探していたものです。あなたはフランス人だと思います(たぶん間違っています)。そして、1つのケースは、フランス語で遭遇する可能性のあるハンドルではありません。Jean-Pierre、Marie-Charlotteなどの合成名などです。私はreg expは初めてですが、-?姓の場合と同じように、最初の2つの単語の間に、仕事をすることができます。
Linpter

こんにちは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

私はそれを検索、検索、再生、再生しましたが、完全ではありませんが、1つの変数として提供された姓名を検証しようとする他の人を助ける可能性があります。

私の場合、その変数は$ 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」までの範囲の1文字と一致«[AZ] {1}»

正確に1回«{1}»

「a」から「z」までの範囲の1文字と一致«[az] {1,30}»

1から30回、可能な限り多くの回数、必要に応じて還元(貪欲)«{1,30}»

リスト「-」にある1文字に一致«[-] {0,1}»

0から1回の間、可能な限り多くの回数、必要に応じて還元(貪欲)«{0,1}»

または、以下の2番目の正規表現に一致します(次の代替案が失敗した場合にのみ試行します)«[AZ] {1} [-\ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1}»

「A」から「Z」までの範囲の1文字と一致«[AZ] {1}»

正確に1回«{1}»

以下のリストにある単一の文字に一致«[-\ '] {1}»

正確に1回«{1}»

文字「-」«-»の1つ「 '」文字«\'»

「A」から「Z」までの範囲の1文字と一致«[AZ] {0,1}»

0から1回の間、可能な限り多くの回数、必要に応じて還元(貪欲)«{0,1}»

「a」から「z」までの範囲の1文字と一致«[az] {1,30}»

1から30回、可能な限り多くの回数、必要に応じて還元(貪欲)«{1,30}»

リスト「-」にある1文字に一致«[-] {0,1}»

0から1回の間、可能な限り多くの回数、必要に応じて還元(貪欲)«{0,1}»

または、以下の3番目の正規表現に一致します(一致しない場合はグループ全体が失敗します)«[az] {1,2} [-\ '] {1} [AZ] {1} [az] {1,30} »

「a」から「z」までの範囲の1文字と一致«[az] {1,2}»

1〜2回、可能な限り多くの回数、必要に応じて還元(貪欲)«{1,2}»

「」と「 '」の間の単一の文字に一致します«[-\'] {1}»

正確に1回«{1}»

「A」から「Z」までの範囲の1文字と一致«[AZ] {1}»

正確に1回«{1}»

「a」から「z」までの範囲の1文字と一致«[az] {1,30}»

1から30回、可能な限り多くの回数、必要に応じて還元(貪欲)«{1,30}»

この検証は、フォームに記入するすべての人が西洋の名前を持っていることを完全に想定していることを知っています。これにより、世界中の大多数の人々が排除される可能性があります。しかし、これは正しい方向への一歩だと感じています。おそらく、この正規表現は、教祖が単純に対処するには基本的すぎるか、または上記のコードを検索で見つけることができなかった他の理由がある可能性があります。私はこのビットを理解しようとするのにあまりにも長い時間を費やしました。以下の私のテスト名を見ると、おそらくあなたは私のすべてがこれにどれほど霧がかかっているかに気付くでしょう。

次の名前でコードをテストしました。結果は各名前の右の括弧内にあります。

  1. スティーブ・スミス(失敗)
  2. Stev3 Smith(失敗)
  3. スティーブ・スミス(失敗)
  4. スティーブ・スミス(失敗)
  5. スティーブSm1th(スティーブSmで渡される)
  6. d'Are to Beaware(Are to Beawareに渡されます)
  7. ジョーブロー(合格)
  8. ヒョギョンウ(合格)
  9. マイク・オニール(合格)
  10. スティーブジョンソンスミス(合格)
  11. ヨゼフ・シュモゼフ・ヒームデル(合格)
  12. O Henry Smith(合格)
  13. マタイダラス(合格)
  14. マーティンルーサーキングジュニア(合格)
  15. ダウンタウンジェームスブラウン(合格)
  16. ダレン・マッカーティ(合格)
  17. George De FunkMaster(合格)
  18. カーティスBボールバスケットボール(合格)
  19. アフマドエルジェフェ(合格)

基本的な名前がある場合、上記のコードが機能するためには、1つから5つまでが必要です。これは、テスト中に使用したものと同様で、このコードが適している場合があります。

改善点があればお知らせください。私はまだ初期段階です(RegExを理解する最初の数か月)。

おかげで、幸運、スティーブ


1
「The Fourth」や「IV」などはこれで動作しますか?
majidarif 2015

11

名は

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

名の部分全体を30文字より短くする必要がある場合は、それを個別に確認する必要があると思います。式".{3,30}"はそれを行う必要があります。

姓の要件は次のようになります

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

しかし、これらをチェックする必要があります。スペースを含む姓はたくさんあります。


これは間にスペースをチェックしますか?
Y_Y

2
何についてオコナー?アポストロフィも含める必要があります。
宇宙飛行士、2014年

1
かなり不完全です。名は、ハイフンを含む「Jean-Claude」とすることができます。姓は、引用符付きの「D'arc」にすることができます。さらに、「François」が名の場合はどうなりますか?
バート

1
「アル」はどうですか?有効な名。たった2文字。中国語、ロシア語、ヒンディー語の名前はどうですか?ヨーロッパの名前はどうですか?
Christian Hujer、2016年

これは、多くの英語以外の名前(ラテン語以外の名前)では機能しません
oldboy

7

マジェックが言ったように:

次のような名前を忘れないでください。

マティアス・ダラス

マーティン・ルーサー・キング・ジュニア。

ヘクターソーセージハウゼン

次のようなケースを削除するには:

・・マティアス

マーティンキングジュニア

これはより多くのケースをカバーします:

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

文字の長さを制限したいので、そのためのコードは何でしょうか?
G.Abhisek

1
はい、マーティン・ルーサー・キング・ジュニアが試合として戻ってきました。ヘンリー・ザ・エイスも同様です。
Steve Kinzey 2016年

7

私は国際パスポート(ICAO)を検証するアプリに取り組んでいます。サポートされているのは英語の文字のみです。ほとんどの外国の国民文字はラテン文字の文字(例:e by e)で表すことができますが、文字に「e」を追加する必要があるドイツ語のウムラウトなど、追加の文字を必要とする国の文字がいくつかあります。例ae 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あなたは私の正規表現を使用しませんでした。これを使用:/ ^ [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である場合、最初のグループはJohn Mになります。 、2番目のグループはSmithになります。


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

^は、行の先頭に位置をアサートします。

\ p {L}は、あらゆる言語のあらゆる種類の文字に一致します

{2、}数量詞— 2回から無制限の回数まで可能な限り多く一致し、必要に応じて返します(貪欲)

$は行の終わりに位置を表明します

したがって、数字や他の文字を含まない、少なくとも2つの文字(または記号)を含む任意の言語の名前である必要があります。


'や-などの一部の文字は名前に使用できることに注意してください。
Mathijs Segers

1

したがって、お客様と一緒にこのクレイジーな正規表現を作成します。

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

1

姓と名については、実際に探す必要があるのは2つだけです。

  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も失敗し、二重バレルの名前も問題になります。これは、そのような有効な名前を持つ人々にとって非常にイライラするでしょう。
Wilt

オコナーのような名前のアポストロフィはどうですか?
Fogmeister 2015年

私の表現はMichael Jordan O'Reilly Jr.を有効な名前として返します
Steve Kinzey 2016年

0

次の式は、UTF-16でサポートされているすべての言語で機能し、名前に最低2つのコンポーネント(つまり、first + last)があることを保証しますが、ミドルネームもいくつでも許可します。

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

これを書いている時点では、他のどの回答もその基準のすべてを満たしているようには見えません。(^\p{L}{2,}$最も近い)でさえ、U+FEFF(ゼロ幅の途切れのないスペース)などの「見えない」文字にも一致するため、不十分です。


regexr.comの JavaScriptを渡さない1)すべてのブラウザーでUnicode機能がサポートされていない可能性があることを警告します。2)また、正規表現で数値を許可しています。例:michael dimmittsasd2123123
Michael

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; 
} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.