Regex Überschniedung von Ausdrücken

chalkbag

Bekanntes Mitglied
Hallo zusammen,


nehmen wir an ich habe folgenden String

Java:
str = "DV31DV32DV51DV52S205SA111A222"

aus diesem möchte ich mit folgenden regulären Ausdrücken

Java:
Pattern pat1= Pattern.compile("([a-zA-Z]{2}?[0-9]{2}?)");
Pattern pat3 = Pattern.compile("([a-zA-Z][0-9]{3}[a-zA-Z]?)");

folgendes Ergebnis erhalten

Code:
DV31
DV32 
DV51 
DV52 
SA11 
S205S 
A111
A222

Allerdings erhalte ich

Code:
DV31
DV32 
DV51 
DV52 
SA11 
S205S 
A111A

Das Problem ist das A111A erkannt wird, obwohl ich A111 und A222 gerne hätte.

Kann ich dem Matcher sagen das er nicht maximal munch sondern maximal fit verwenden soll?
Oder anders, A111A sollte er nur erkennen wenn das Folgezeichen auch ein [a-zA-Z] oder das Satzende ist?

Ich hoffe man versteht mich, vielen dank schonmal
 
S

SlaterB

Gast
günstig wäre Posten kompletten Codes und dein Beispiel hättest du etwas einfacher wählen können, pat1 ist letztlich doch egal?
ein weiteres ? soll angeblich genügsame Pattern bedeuten, folgendes scheint zu funktionieren:
Java:
public class Test {
    public static void main(String[] args)  {
        String str = "DV31DV32DV51DV52S205SA111A222";
        Pattern pat3 = Pattern.compile("([a-zA-Z][0-9]{3}[a-zA-Z]??)");
        Matcher m = pat3.matcher(str);
        while (m.find())   {
            System.out.println(m.group());
        }
    }

}
Code:
S205
A111
A222
edit: ok, dass beim S205 das hintere S fehlt ist auch nicht optimal..,
was anderes sehe ich leider nicht im Guten, Überschneidungen sind schon böse
 
Zuletzt bearbeitet von einem Moderator:

chalkbag

Bekanntes Mitglied
Hallo SlaterB,

vielen Dank für deine Antwort. Stimmt das erste Pattern hätte ich weglassen können und ich hätte es sicherlich noch entschlagen sollen. Aber du hast es ja verstanden :bae:

Ja, die Typen haben sich nachträglich geändert und bei deren Erstellung wurde keine Rücksicht genommen ob die sich eventuell RegEx-technisch überschneiden. So habe ich jetzt den Salat, wahrscheinlich muss ich jetzt mit der Hand nacharbeiten bei jedem Treffer, und schauen was das Nächste und Übernächste Zeichen ist. Natürlich sehr bäh :wuerg:, und ich hatte hier auf eine schönere Idee gehoft.

Vielleicht hat ja noch Jemand hier einen Heureka-Moment.

Trotzdem schonmal danke :)
 

timbeau

Gesperrter Benutzer
Findet die ersten Paare nicht. Habe auch überlegt aber es scheint mit diesen Anforderungen nicht zu gehen. Wie soll SA11 und A111 gefunden, bzw welchen Sinn soll das ergeben?
 

chalkbag

Bekanntes Mitglied
Danke für die Antworten,

die Sinnfrage stellt sich nicht. Die Typen sind so definiert und ich kann keinen Einfluss darauf nehmen.
Ich denke es wird wirklich darauf hinauslaufen, dass ich manuell noch prüfen muss.
 

faetzminator

Gesperrter Benutzer
Gibt es denn irgendwelche weitere Regeln, wann etwas so oder so ausschaut? Z.B. dass es nur zwei Buchstaben am Anfang hat, wenn diese "DV" entsprechen.
 

timbeau

Gesperrter Benutzer
Danke für die Antworten,

die Sinnfrage stellt sich nicht. Die Typen sind so definiert und ich kann keinen Einfluss darauf nehmen.
Ich denke es wird wirklich darauf hinauslaufen, dass ich manuell noch prüfen muss.

Was heißt "so definiert?" Welcher Regel unterliegen diese Typen? Und soll wirklich aus SA111 SA11 und A111 werden?
 

chalkbag

Bekanntes Mitglied
Regeln wären wie folgt

Typ 1: 2 Buchstaben und 2 Zahlen
Typ 2: 1 Buchstabe 3 Zahlen 1 Buchstabe
Typ 3: 1 Buchstabe 3 Zahlen

Mischung der Typen im entsprechenden Inhalt ist beliebig möglich.

Ich hätte mir gedacht, zuerst suche ich Typ 1 wie gehabt, anschließend Typ 3.
Dafür würde ich mit den üblichen Pattern danach suchen. Habe ich einen Treffer kontrolliere ich

1. Folgezeichen = EOF -> Typ 3
2. Fz 1 = Buchstabe + Fz 2 = Zahl -> Typ 3
3. Fz 1 = Buchstabe + Fz 2 = Buchstabe + Fz 5 = Buchstabe -> Typ3
Muss Typ 2 sein

(Kann gut sein das da noch ein paar Fälle fehlen, seh ich wohl erst zum Test)
 

faetzminator

Gesperrter Benutzer
Das kann man IMHO nur herausfinden, wenn man sich von rechts nach links arbeitet. Denn du kannst Typ 2 von 3 - im Fall, dass es da 2 Buchstaben am Schluss gibt - nur unterscheiden, wenn du weisst, ob beim nächsten Element Typ 1 oder ein anderer vorhanden ist. Wenn du aber von rechts nach links gehst, dann musst du nur von der aktuellen Position so viel nach Links, dass nach 2 Zahlen jeweils 2 und bei 3 Buchstaben jeweils 3 Zahlen folgen werden.
Irgendwie könnte man das sicher mit Regex lösen, allerdings gehts wohl einfacher "von Hand".
 

timbeau

Gesperrter Benutzer
Aufbauend auf fjords Regex und leider nicht performant:

Java:
public class SplitRegex {

	public static void main(String[] args) {
		
		Set<String> found = new HashSet<String>();
		
		/**
		 * Typ 1: 2 Buchstaben und 2 Zahlen
		 * Typ 2: 1 Buchstabe 3 Zahlen 1 Buchstabe
		 * Typ 3: 1 Buchstabe 3 Zahlen 
		 */
		String str = "DV31DV32DV51DV52S205SA111A222";
		Pattern typ1 = Pattern.compile("([a-zA-Z]{2}[0-9]{2}|[a-zA-Z]\\d{3}(?:[a-zA-Z](?!\\d{3})(?![a-zA-Z]\\d\\d[a-zA-Z]))?)");
		Matcher matcher = typ1.matcher(str);
		int start = 0;
		while(matcher.find(start++)){
			found.add(matcher.group());
		}
		
		for (String string : found) {
			System.out.println(string);
		}
	
	}
}
 

chalkbag

Bekanntes Mitglied
ohne die Start Variable schaut das schon gut aus

Code:
S205S
A222
DV51
DV52
DV31
DV32
A111

mit start++ kommt bei mir

Code:
S205S
SA11  <-- der wurde so nicht angegeben
A222
DV51
DV52
DV31
DV32
A111

Sieht aber schon mal ganz gut aus, ich werde heute Nachmittag etwas rumspielen. Aber schonmal recht herzlichen Dank :applaus:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F RegEx bei Hexstring Allgemeine Java-Themen 8
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
Stillmatic RegEx Matches ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben