2016-08-12 3 views
0

Ich versuche, eine Regex zu erstellen, um eine Zeichenfolge nach einem zweiten Punkt zu teilen.Versuch, eine Regex zu verallgemeinern

Bsp .: Der String "AF23.2016.12" sollte {"AF23.2016", ".12"}

gespalten Bis weit ich die folgen regex meiner Split bekam:

"(?<=(\\p{Alnum}+)\\.(\\p{Alnum}{4}))(?=\\.)" 

Dies funktioniert für diesen String in Ordnung, aber ich habe zu spezifizieren die Länge der zweite Teil (\\p{Alnum}{4}) aber es ist Variante.

Ich habe versucht + statt {4} zu verwenden, aber wenn es funktioniert, funktioniert der Split nicht. Ergebnis: "AF23.2016.12"

Wie kann ich den zweiten Teil in beliebiger Länge verallgemeinern?

+1

Warum nicht etwas wie folgt aus: „[. ^] * \. [^.] * (\ .. *) "oder gibt es mehr Bedingungen? –

+1

Ist der zweite Punkt auch immer der letzte Punkt? Wenn es so ist, wird "" (? = \\. [^.] * $) "' Funktionieren. –

+0

@AlanMoore super, ich habe nicht bemerkt, dass ich diesen Weg nutzen könnte. – Dener

Antwort

2

Wenn Sie "(?<=\\.(\\p{Alnum}+))(?=\\.)" versuchen erhalten Sie eine Ausnahme zu sagen

Look-hinter-Gruppe keine offensichtliche maximale Länge hat

(ich weiß nicht, warum Sie mit der Nachricht nicht erhalten zwei +; vielleicht sollten Sie.) Aber es gibt eine Idee, was Sie tun könnten, um es zum Laufen zu bringen: Beschränken Sie die Länge der Look-Behind-Gruppe. Anstatt unbegrenzt + verwenden Sie etwas wie {1,1000}. Dies funktioniert für mich:

"(?<=(\\p{Alnum}{1,1000})\\.(\\p{Alnum}{1,1000}))(?=\\.)" 

(. Raum und Zeit oder Anforderungen aus der Auswahl eines kleineren Wiederholungsgrenze profitieren könnte ich das nicht überprüft.)

+0

Wow. Java Regex unterstützt tatsächlich Look-Behinds variabler Länge? Das ist äußerst selten. – usr2564301

+0

Ich denke, jetzt verstehe ich, warum nicht unbegrenzt '+' verwenden. Vielen Dank. '{1, 1000}' ist eine gute Lösung. Ich werde 100 nur lol verwenden – Dener

0

Diese Regex scheint zu tun, was Sie wollen:

^([A-F0-9]+?\.[A-F0-9]+?)\.([A-F0-9]+)$ 

Oder mit Ihrem \\p{Alnum} Syntax:

^(\\p{Alnum}+?\.\\p{Alnum}+?)\.(\\p{Alnum}+)$ 

Ich bin nicht sicher, in welchem ​​Zusammenhang Sie diese Regex verwenden. Die Ergebnisse werden den ersten und zweiten Teil in \1, \2 setzen.

+0

Dies funktioniert nicht, wenn das erste Zeichen bereits ein Punkt ist. Nicht sicher, ob das ein Problem ist. – AlexR

1

Statt Split ist es besser, ein Spiel zu verwenden, erfasst Gruppen mit:

(\w+\.\w+)(\.\w+) 

RegEx Demo

In Java:

Pattern p = Pattern.compile("(\\w+\\.\\w+)(\\.\\w+)"); 

Dann Matcher API verwenden, um beide gefangen Gruppen zu erhalten.

+0

Ich musste teilen, nicht übereinstimmen – Dener

Verwandte Themen