2016-08-04 6 views
-1

Ich versuche, einen Code von Java zu schreiben, der erlaubt, eine Liste der Städte abhängig vom Namen der Stadt oder seiner Postleitzahl anzuzeigen:Wie wird eine Zeichenfolge, die eine Stadt oder ihre Postleitzahl mit Akzent darstellt, regex?

Ich schrieb viele Ausdrücke, aber sie arbeiteten nicht 100%. Dies ist mein letzter Ausdruck:

([A-Z_]+)(:)([0-9]+) 

Der Ausdruck sollte den Namen eine Stadt passen: es könnte sein: Lonéy' ed oder seinen Code Post 57000

Hat jemand eine Idee hat, wie mein Ausdruck zu verbessern?

Danke.

+0

Try '(\ p {Lu} [\ p {L} \ s'-] *): (\ d +)' (das doppelte des Schrägstrichs in einem Java-String wörtlich). –

+0

@ WiktorStribiżew Thnx aber nein, es funktioniert übrigens nicht, wie Ziffern auf 5 zu begrenzen?weil eine Postleitzahl besteht aus 5 Ziffern – Chinovski

+0

gibt es ein Leerzeichen in Ihrem Beispiel? – diginoise

Antwort

2

Da Java7 Sie Folgendes tun:

Pattern.compile("([\\p{Alpha} '-_]+):(\\d{5})", Pattern.UNICODE_CHARACTER_CLASS)

Halten Sie das Hinzufügen Verbindungs ​​Zeichen (hier [ ‚-_]) für alle Ihre Bedürfnisse zugeschnitten sind.

Das Muster macht keine Annahmen über den Fall des Ortsnamens, da es in einigen nicht lateinischen Schriften keine Fälle gibt.

EDIT: hinzugefügt 5-stellig Postleitzahl Erkennung und ein Raum für den Namen Erkennung

+0

Es scheint zu funktionieren, können Sie bitte Ihren Ausdruck erklären? und wenn 'Pattern.UNICODE_CHARACTER_CLASS' akzentuierte Zeichen enthält? – Chinovski

+0

Es enthält alle möglichen diakritischen Zeichen (Akzentbuchstaben) aus allen Sprachen sowie nicht-lateinische Buchstaben. – diginoise

+1

Btw, 'Pattern.UNICODE_CHARACTER_CLASS' ist ein Modifier-Flag, keine Zeichenklasse. Bitte beziehen Sie sich auf die Java API für die 'Muster' Klasse. – diginoise

2

Ich schlage vor, mit

"(?U)(\\p{Lu}[\\p{L}\\p{M}\\s'-]*):(\\d{5})\\b" 

Es bedeutet:

  • (?U) - einen Pattern.UNICODE_CHARACTER_CLASS Inline-Flag, das \b macht Wort Bounsary und \d Ziffer Zeichenklasse Unicode im Muster
  • (\\p{Lu}[\\p{L}\\p{M}\\s'_-]*) - Gruppe 1 Capturing:
    • \\p{Lu} - ein Groß Unicode Buchstaben
    • [\\p{L}\\p{M}\\s'_-]*-0 oder mehr Zeichen, die entweder Unicode Buchstaben (\\p{L}), diakritische Zeichen (\\p{M}), Leerzeichen (\\s), ', _ oder - (FEST, dass der Bindestrich am Ende der Zeichenklasse sein muss, so dass es als wörtlichen Bindestrich behandelt werden könnte)
  • : - lit eral Kolon
  • (\\d{5}) - (Gruppe 2) fünfstellig
  • \\b - eine Wortgrenze, so dass wir mit einem Wort char (nicht mehr als 5 Ziffern in einem 110-stellige String), mit "(?!\\d)" ersetzt werden kann, nicht gefolgt nur 5 Ziffern entsprechen

Siehe Java demo:

String s = "Lonéy' ed:57000"; 
Pattern pattern = Pattern.compile("(?U)(\\p{Lu}[\\p{L}\\p{M}\\s'-]*):(\\d{5})\\b"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
}