2017-09-06 24 views
2

すべての標準文字、フランス文字、スペース、ダッシュ(ハイフン)を許可する正規表現を変更する必要がありますが、一度に1つのみです。フランス語名のJava正規表現

import java.util.regex.Pattern; 

public class FrenchRegEx { 

    static final String NAME_PATTERN = "[\u00C0-\u017Fa-zA-Z-' ]+"; 

    public static void main(String[] args) { 

     String name; 

     //name = "Jean Luc"; // allowed 
     //name = "Jean-Luc"; // allowed 
     //name = "Jean-Luc-Marie"; // allowed 
     name = "Jean--Luc"; // NOT allowed 

     if (!Pattern.matches(NAME_PATTERN, name)) { 
      System.out.println("ERROR!"); 
     } else System.out.println("OK!"); 
    } 
} 

をし、それが可能に - 名前として「ジャン・リュック」を、それが許可されていません。

私が今持っていることです。

これに関する助力?おかげさまで

+1

'[\ u00C0- \ u017Fa-zA-Z]([ - '] [\ u00C0- \ u017Fa-zA-Z])*' – Lothar

+1

'\ u00C0- \ u017F'の文字のほとんどはarenフランス語で使われています。 –

+2

必須のリンク:[Falsehoods Programmersは名前について信じています](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。 –

答えて

7

したがって、1つ以上の他の文字で区切られた0以上のハイフンのパターンが必要です。それはちょうどそのようにパターンを書き込むの問題です:

"[\u00C0-\u017Fa-zA-Z']+([- ][\u00C0-\u017Fa-zA-Z']+)*" 

これはまた、あなたが名前にハイフンやスペースで開始または終了したくないと仮定し、またあなたは、行に複数のスペースが欲しいということ、およびまた、ハイフンを続行するか、ハイフンを続けることもできないようにする必要があります。

+1

私は、アポストロフィを互いに隣り合ってはいけないシンボルのリストに移動します。私はOPが 'De''s'や' Bob 'Ray'とマッチしたいと思っています。私にとって唯一の疑わしいケースは、名前の最後にアポストロフィがある場合があります。 –

4

連続するハイフンを許可しないでください。あなたは否定先読みでそれを行うことがあります。

static final String NAME_PATTERN = "(?!.*([-' ])\\1)[\u00C0-\u017Fa-zA-Z-' ]+"; 

に別の方法を使用し、連続している特殊文字のいずれかを禁止するには

static final String NAME_PATTERN = "(?!.*--)[\u00C0-\u017Fa-zA-Z-' ]+"; 
            ^^^^^^^^ 

どこ特殊な文字列にマッチするパターンを少しアンロールすることですCHAR(S)(あなたは、文字列のようなAbc-def'hereを一致させる必要がある場合はIE)文字間に表示されることがありますが、連続して表示することはできません。

static final String NAME_PATTERN = "[\u00C0-\u017Fa-zA-Z]+(?:[-' ][\u00C0-\u017Fa-zA-Z]+)*"; 

のみ許可する1特殊な文字目へは文字の間にのみ現れることができます。あなたは完全な文字列の一致を必要と.matches()メソッド内のパターンを使用しているので、あなたがここにアンカーを必要としない

static final String NAME_PATTERN = "[\u00C0-\u017Fa-zA-Z]+(?:[-' ][\u00C0-\u017Fa-zA-Z]+)?"; 

注:あなただけの)abc-def、またはabc'defのような文字列を許可するように旧姓場合。

注:チューニングに[\u00C0-\u017Fa-zA-Z]よう[\u00C0-\u017Fa-zA-Z]文字クラスに[-' ]文字クラスから、文字列のどこにでも現れることがあり、特殊な文字を移動することでパターンを進めるが、-に気をつけて。最後には、]の近くに置く必要があります。

2

([\u00C0-\u017Fa-zA-Z']+[- ]?)+をお試しください。これは、正確に1つのダッシュまたはスペースで区切られた1つ以上の名前と一致します。

+0

注 '([\ u00C0- \ u017Fa-zA-Z '] + [ - ]?)+'は、文字列の最後に '-'またはスペースも許します。 –

+0

@WiktorStribiżew:あなたの答えの2つの最初のパターンもそれを可能にします。 –

+0

はい、私はちょうどそれに注意します。 –