7 Stimmen

Regulärer Ausdruck zur Extraktion von Label-Wert-Paaren in Java

Ich habe eine Datei, die mehrere Zeilen ähnlich wie diese enthält:

Name: Peter
Address: St. Serrano número 12, España
Country: Spain

Und ich muss die Adresse mit Hilfe eines regulären Ausdrucks extrahieren, wobei zu berücksichtigen ist, dass sie Punkte, Sonderzeichen (ñ, ç), áéíóú... enthalten kann.

Der aktuelle Code funktioniert, sieht aber ziemlich hässlich aus:.

Pattern p = Pattern.compile("^(.+?)Address: ([a-zA-Z0-9ñÑçÇáéíóú., ]+)(.+?)$",
                            Pattern.MULTILINE | Pattern.DOTALL);
Matcher m = p.matcher(content);
if (m.matches()) { ... }

Bearbeiten: Das Adressfeld könnte auch in mehrere Zeilen aufgeteilt werden

Name: Peter
Address: St. Serrano número 12,   
Madrid
España
Country: Spain

Edit: Ich kann weder ein Properties-Objekt noch einen YAML-Parser verwenden, da die Datei auch andere Informationen enthält.

0voto

Vinko Vrsalovic Punkte 252104

Kann er einen Zeilenumbruch enthalten? Wenn der Text keinen Zeilenumbruch enthalten darf, brauchen Sie den Modifikator "Mehrzeilig" nicht zu verwenden und können stattdessen Folgendes tun

Pattern p = Pattern.compile("^Address: (.*)$");

Wenn dies der Fall ist, kann ich mir eine Alternative vorstellen, nämlich

Pattern p = Pattern.compile("Address: (.*)\nCountry", Pattern.MULTILINE);

Ohne DOTALL wird der Punkt nicht mit einem Zeilenumbruch übereinstimmen, so dass Sie ihn explizit in der Regexp angeben können, was Ihnen erlaubt, das zu tun, wonach Sie gefragt haben.

0voto

Brad Gilbert Punkte 33120

Sie sollten sich unbedingt die YAML .

Sie könnten versuchen JYaml .

Und das Beste: Es gibt Implementierungen in vielen Sprachen.

ps Ich habe den Beispieltext in YAML::XS und es funktioniert perfekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X