web-dev-qa-db-ja.com

姓と名の正規表現

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

名には、文字のみを含める必要があり、スペースを含み文字を含まない複数の単語を使用できます。少なくとも3文字で、上位30文字までです。空の文字列は検証されません。すなわち:

ジェイソン、ジェイソン、ジェイソンスミス、ジェイソンスミス、ジェイソン、ジェイソンスミス、ジェイソンスミス、ジェイソンスミス

姓については、1つのWordで、文字のみで、少なくとも3文字、上位30文字でなければなりません。空の文字列は検証されません。 IE:lazslo、Lazslo、LAZSLO

101
Hellnar

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

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

これは、ほとんどのことでトリックを行うはずです:

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

またはスーパースイートユニコードで国際名をサポート:

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

162
maček

名と姓の形式について誤った仮定をします。空であることを確認する以外に、名前をまったく検証しない方がおそらく良いでしょう。

68
Sjoerd

これらの答えをすべて調べた後、ほとんどの言語をサポートし、Word文字のみを許可する小さな正規表現を作成する方法を見つけました。ハイフン、スペース、アポストロフィなどの特殊文字もサポートしています。 pythonでテストしましたが、以下の文字をサポートしています。

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

サポートされる文字:

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

私はそれを検索し、検索し、プレイし、プレイしましたが、完璧ではありませんが、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 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}"

以下の正規表現のいずれかに一致します(この代替が失敗した場合にのみ次の代替を試みます)"[A-Z] {1} [a-z] {1,30} [-] {0,1}"

「A」と「Z」の間の範囲の1文字に一致"[A-Z] {1}"

正確に1回"{1}"

「a」と「z」の間の範囲の1文字に一致"[a-z] {1,30}"

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

リスト「-」にある単一の文字に一致する"[-] {0,1}"

ゼロから1回の間、可能な限り何度も、必要に応じて(貪欲に)返す"{0,1}"

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

「A」と「Z」の間の範囲の1文字に一致"[A-Z] {1}"

正確に1回"{1}"

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

正確に1回"{1}"

文字「-」の1つ"-"A '文字"\'"

「A」と「Z」の間の範囲の1文字に一致"[A-Z] {0,1}"

ゼロから1回の間、可能な限り何度も、必要に応じて(貪欲に)返す"{0,1}"

「a」と「z」の間の範囲の1文字に一致"[a-z] {1,30}"

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

リスト「-」にある単一の文字に一致する"[-] {0,1}"

ゼロから1回の間、可能な限り何度も、必要に応じて(貪欲に)返す"{0,1}"

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

「a」と「z」の間の範囲内の1文字に一致"[a-z] {1,2}"

1〜2回、可能な限り何度も、必要に応じて還元(貪欲)"{1,2}"

「」から「 '」までの範囲の1文字に一致"[-\'] {1}"

正確に1回"{1}"

「A」と「Z」の間の範囲の1文字に一致"[A-Z] {1}"

正確に1回"{1}"

「a」と「z」の間の範囲の1文字に一致"[a-z] {1,30}"

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

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

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

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

基本的な名前を持っている場合、上記のコードが機能するためには、最大5つまで存在する必要があります。これは、テスト中に使用したものと似ています。このコードは役に立つかもしれません。

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

ありがとう、そして幸運、スティーブ

15
Steve Kinzey

みなさん、良い一日を。

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

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

1)ジョン・スミス
2)John D'Largy
3)John Doe-Smith
4)John Doe Smith
5)Hector Sausage-Hausen
6)マティアス・ダラス
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 -)") ]

エスケープ文字の二重\に注意してください

RegExを初めて使用する方のために、説明を含めます。
^(行の開始)
[a-zA-Z] {2、}(少なくとも2文字の名前を除く)
\ s(名前と姓の間の空白を探します)
[a-zA-Z] {1、}(少なくとも1文字が必要)
'?-?'または-の可能性二重樽でハイフンでつながれた姓の場合)
[a-zA-Z] {2、}(少なくとも2文字の名前を除く)
\ s?(別の空白の可能性)
([a-zA-Z] {1、})?*(2番目の姓の可能性)<* br />

これがあなたのプロジェクトに役立つことを願っています。
敬具
フランソワ・ミュラー

13
Francois Muller

名は

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

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

あなたの姓の要件は、

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

しかし、これらを確認する必要があります。スペースを含む姓がたくさんあります。

10
Jens

Mačekが言ったように:

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

マティアス・ダラス

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

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

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

..マティアス

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

これにより、さらに多くのケースがカバーされます。

^([a-z]+[,.]?[ ]?|[a-z]+['-]?)+$
7
Asim K T

簡単にするために、次を使用できます。

(.*)\s(.*)

私がこれについて気に入っているのは、姓が常に名の後にあるため、この一致したグループをデータベースに入力し、名前がJohn M. Smithの場合、最初のグループはJohn Mになります。 、2番目のグループはSmithです。

5
egekhter

私は国際パスポート(ICAO)を検証するアプリに取り組んでいます。英語の文字のみをサポートしています。ほとんどの外国の国民文字は、ラテンアルファベットの文字で表すことができます。 èby eには、ドイツ語のウムラウトのように、文字に「e」を追加する必要があるドイツのウムラウトなど、それらを表すために追加の文字を必要とするいくつかの国の文字があります。 äby ae。

これは、使用する姓と名のJavaScript正規表現です。

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

国際パスポートの最大文字数は31文字まで 。正規表現に含めるのではなく、Wordエラーメッセージを改善するために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>

私が使う:

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

そして、他の手段を使用してmaxlengthをテストします

3
malix

これは私が使用するものです。この正規表現は、A-Z a-z ,space and -からの最小文字数の名前のみを受け入れます。

名前の例:Ionut Ionete, Ionut-Ionete Cantemir, Ionete Ionut-Cantemirm Ionut-Cantemir Ionete-Second

この変更{3、}を{6、}に変更する場合、名前の文字の制限は3です。

([a-zA-Z\-]+){3,}\s+([a-zA-Z\-]+){3,}
3
Ionut Ionete
^\p{L}{2,}$

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

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

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

$は行末の位置を表明します

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

2

そのため、顧客とともにこのクレイジーな正規表現を作成します。

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

姓と名については、実際に探しているべきものは2つだけです。

  1. 長さ
  2. コンテンツ

これが私の正規表現です。

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

1。長さ

ここで、{3,20}は文字列の長さを3〜20文字に制限します。

2。コンテンツ

角括弧[A-Za-z]の間の情報では、大文字と小文字を使用できます。後続のすべての記号(-,.)も使用できます。

1
J Dorrian

here

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

次の式は、UTF-16でサポートされている任意の言語で機能し、名前に2つ以上のコンポーネントが存在することを保証します(ただし、最初と最後)。任意の数のミドルネームを許可します。

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

この記事を書いている時点では、他の答えはどれもその基準をすべて満たしていないようです。最も近い^\p{L}{2,}$でも、U+FEFF(ゼロ幅の空白なし)などの「見えない」文字と一致するため、不足します。

0
Gabriel Somoza