2017-09-06 36 views
2

Ich muss regulären Ausdruck ändern, um alle Standardzeichen, französischen Zeichen, Leerzeichen und Bindestrich (Bindestrich) aber nur einzeln zuzulassen.Java regulärer Ausdruck für französische Namen

Was ich jetzt habe, ist:

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!"); 
    } 
} 

und es erlaubt 'Jean - Luc' als Name und das ist nicht erlaubt.

Irgendwelche Hilfe dabei? Danke.

+1

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

+1

Die meisten Buchstaben im Bereich '\ u00C0- \ u017F' sind aren werde nicht auf Französisch verwendet. –

+2

Obligatorischer Link: [Programmierer von Unwahrheiten glauben an Namen] (http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/). –

Antwort

7

Sie wollen also ein Muster, das eine 0 oder mehr Bindestriche ist, getrennt durch 1 oder mehrere andere Zeichen. Es ist nur eine Frage des Schreibens das Muster, das Art und Weise:

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

Dies auch Sie Namen mit einem Bindestrich oder Leerzeichen beginnen oder enden nicht wollen wird davon ausgegangen, noch, dass Sie mehr als ein Raum in einer Reihe werden soll, und dass Sie auch verhindern möchten, dass ein Leerzeichen folgt oder ein Bindestrich weitergeht.

+1

Ich würde den Apostroph in die Liste der Symbole verschieben, die nicht nebeneinander angezeigt werden sollten. Ich bezweifle, dass das OP "De''s" oder "Bob 'Ray" zusammenbringen will. Der einzige fragliche Fall ist für mich, dass ein Apostroph am Ende eines Namens in manchen Fällen gültig sein könnte. –

4

Sie müssen aufeinanderfolgende Bindestriche nicht zulassen. Sie können es mit einem negativen Look-Ahead tun:

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

einem der Sonderzeichen, um nicht zuzulassen, um in Folge verwenden

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

Eine andere Möglichkeit, das Muster ein bisschen entrollen ist Strings zu entsprechen, wo die besondere char (n) kann zwischen Buchstaben erscheinen, aber erscheinen können nicht aufeinanderfolgend (dh, wenn Sie Abc-def'here wie Strings übereinstimmen müssen):

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

oder nur 1 spezielle Zeichen erlauben th kann nur zwischen Buchstaben erscheinen (d. h. wenn Sie nee nur Zeichenketten wie abc-def zu erlauben, oder abc'def):

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

Beachten Sie, dass Sie keine Anker hier, weil Sie das Muster in einem .matches() Verfahren verwenden, das eine vollständige Zeichenfolge Spiel erfordert.

HINWEIS: Sie können durch bewegliche Sonderzeichen stimmen die Muster weiter, die in der Zeichenfolge aus der [-' ] Zeichenklasse zu den [\u00C0-\u017Fa-zA-Z] Zeichenklassen beliebigen Stellen, wie [\u00C0-\u017Fa-zA-Z], aber achten Sie auf -. Es sollte am Ende, in der Nähe von ] platziert werden.

2

Versuchen Sie, ([\u00C0-\u017Fa-zA-Z']+[- ]?)+ zu verwenden. Dies würde einem oder mehreren Namen entsprechen, die durch genau einen Gedankenstrich oder ein Leerzeichen getrennt sind.

+0

Hinweis '([\ u00C0- \ u017Fa-zA-Z '] + [-]?) +' Erlaubt auch ein '-' oder Leerzeichen am Ende der Zeichenfolge. –

+0

@ WiktorStribiżew: die zwei ersten Muster in Ihrer Antwort erlauben es auch. –

+0

Ja, das merke ich einfach. –