web-dev-qa-db-ja.com

Java-フルネームの正規表現

フルネームの正規表現を検証するにはどうすればよいですか?アルファベット(数字なし)と正規表現用のスペースのみが必要です。これは私がこれまでに行ったことです。正規表現の修正を手伝っていただけませんか。どうもありがとうございました

public static boolean isFullname(String str) {
    boolean isValid = false;
    String expression = "^[a-zA-Z][ ]*$"; //I know this one is wrong for sure >,<
    CharSequence inputStr = str;
    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}
9
Nicholas Lie

名前を識別するこの問題は非常に文化中心であり、確実に機能する見込みはありません。 [〜#〜] no [〜#〜]私が知っている地球上のどこの国でも、人の名前を構成するものの正規の形式があるので、これには絶対にお勧めしません。私は合法的に自分の名前を#&*∫Ω∆ Smithに変更することができましたが、それは誰のアルゴリズムにも適合しません。この特定の例が多くの人が行うことではありませんが、多くの人はデータ入力を検討するときにASCIIテーブルの外側を考えないため、問題が発生します。

これが発生する可能性に異議を唱えることはできますが、グローバルな世界では、すべてのユーザーが名前に英語に音訳されたスペルを使用する可能性はますます低くなっています。また、姓名の概念を持たない文化のユーザーがいる可能性もあります。アプリケーションが特定の国でのみ実行されている場合でも、一部のユーザーが他の場所から来ないことを想定しないでください(人々は常に国から国へと移動し、一部のユーザーはあなたのソフトウェア)。

このようなフィールドのSQLインジェクションからアプリを保護し(これらをDBに保存している場合)、そのままにしておきます。

22
jefflunt

このメソッドは名前を検証し、名前に何もないか、数字または特殊文字がある場合はfalseを返します。

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]+"; 
    return str.matches(expression);        
}
5
Ahmed El Reweny

求められたもの

"^[a-zA-Z][ ]*$"の代わりに"^[a-zA-Z ]*$"が必要です。 \sを参照する回答がいくつかありますが、タブのような他の空白が表示されるため、これらは必要ありません。

その他の一般的な例

ちなみに、名の場合はMary-AnnJones-Garciaのようにハイフンでつながれた姓のように、ハイフンを含む姓名があります。 St. Marcのようにピリオドのある姓もあります。最後に、'のようないくつかの姓にO'Donnelがあります。

サイドノート

法的に、名前を Little Bobby Drop Tables ...に変更するか、他のランダムな文字を含めることができます...しかし、そのようなものに実際に対応できるシステムの数はわかりません。

一般的なケース(ワールドワイド)が必要な場合は、ギリシャ文字、キリル文字、漢字などで名前を付けることができるため、フィールドを文字タイプで制限しないでください。英語以外のアクセント文字などもあります。ドイツのumlautのように。

SQLインジェクションが心配な場合は、動的クエリの代わりにパラメータ化されたクエリを使用してください。

推奨される解決策

英語の文字だけが気になり、上記のサンプルケースを処理する正規表現を使用したい場合は、"^[a-zA-Z \-\.\']*$"を使用できます。

2
James Oravec

_[A-Z]_単一の大文字(名前の最初の文字)に一致する

_[a-z]*_任意の数の小文字(他の文字または名前)に一致

_(\s)_ 1つの空白文字(名前間のスペース)に一致

_+_ 1つ以上の前の式(複数の名前に一致するため)

すべて一緒に:

_- matches first names / lastname -_
^([A-Z][a-z]*((\s)))+[A-Z][a-z]*$

または、DiMaggio St. Croix、O'Reilly、Le-Pewなどの名前と一致させます。 MᶜKinleyの「ᶜ」のような似たような文字を覚えているか、名前にあまり一般的でない文字が含まれている人に出くわすことができます。

^([A-z\'\.-ᶜ]*(\s))+[A-z\'\.-ᶜ]*$

1
James Webster