RegEx Pattern Matcher

membersound

Bekanntes Mitglied
Hallo,

ich zerlege eine File mit nem RegEx Pattern.
Die File ist zB so aufgebaut:

one##
two##
one##two##three##
...

Java:
            Pattern pat = Pattern.compile("[^##]+");
            Matcher mat = pat.matcher(strLine);

Allerdings wird dadurch kein leeres Element erkannt:
one####three##
Dort würde mir das zweite Element fehlen, und statt dessen das dritten Element an die zweite Stelle rücken.
Wie kann ich das detektieren?

Danke
 

Peter W. Marth

Aktives Mitglied
Hallo,

der Matcher dient ja nur der Mustererkennung, das Zerlegen von Strings funktioniert mit split() auch mit "leeren Feldern":

Java:
        String s = "one####three##";
        String[] a = s.split( "##" );
        for( String t : a ) {
            System.out.println( "t=" + t );
        }
 

eRaaaa

Top Contributor
Ganz genau habe ich jetzt das Problem nicht verstanden, aber mit Matcher+Pattern ginge das auch irgendwie bestimmt. Ist es so vlt. gemeint:
Java:
		String s = "one####three##";
		Pattern pat = Pattern.compile(".*?##");
		Matcher mat = pat.matcher(s);
		while(mat.find()){
			System.out.println(mat.group());
		}
???:L
 

truesoul

Top Contributor
So sollte es gehen. Da spielt auch die Anzahl der # keine Rolle:
Java:
String text = "zwei##hallo";
String array [] = text .split("[^\\w+]");
        for(String g: array){
            if(!g.isEmpty())
                System.out.println(g);
        }

Gruß
 

membersound

Bekanntes Mitglied
Sorry, hatte irgendwie vergessen die Zerlegung zu posten:

Java:
            while (mat.find()) {
                newString[i] = mat.group(0);
                i++;
            }

Die Anzahl der ## SOLL aber eine Rolle spielen. Also es müssen genau 2 sein, und wenn danach noch 2 weitere kommen muss ein leerer String erzeugt werden.
 

Peter W. Marth

Aktives Mitglied
Wenn man vor dem Erzeugen des Matchers die ggf. fehlenden ## am Ende anfügt, dann geht das.

Java:
        if( !s.endsWith( "##" ) ) {
            s += "##";
        }
        mat = pattern.matcher( s );
...
 

membersound

Bekanntes Mitglied
Ich check immer noch nicht was ich denn jetzt ändern muss, damit ich das bekomme was ich möchte.

Ich möchte:
Code:
one
two

three

"[^##]+" ergibt:
Code:
one
two
three

".*?##" ergibt:
Code:
one##
two##
##
three##

Java:
public class testclass {
    public static void main(String args[]) {
        int i = 0;
        String[] newString = new String[10];
        String strLine = "one##two####three##";
            Pattern pat = Pattern.compile("[^##]+");
            Matcher mat = pat.matcher(strLine);
            while (mat.find()) {

                newString[i] = mat.group(0);
                System.out.println(newString[i]);
                i++;
            }
    }
}
 

eRaaaa

Top Contributor
Dann mache halt eine Gruppe
Java:
		int i = 0;
		String[] newString = new String[10];
		String strLine = "one##two####three##";
		Matcher mat = Pattern.compile("(.*?)##").matcher(strLine);
		while (mat.find()) {
			newString[i] = mat.group(1);
			System.out.println(newString[i++]);
		}
 

membersound

Bekanntes Mitglied
Jetzt müsste ich nur noch Steuerzeichen mit erkennen können. Aus der Dokumentation lese ich heraus, dass das mit "\s" geht.

Aber wie bastel ich das denn jetzt da rein? Ich hab schon alles durchprobiert und krieg es einfach nicht hin :noe:

(Ein String zwischen zwei ## kommt zB aus einem Textfeld, in dem auch Zeilenumbrüche vorkommen. Ich lese eine komplette Zeile dann mit readLine() ein, aber dort wie eben der Zeilenumbruch steht wirds chaotisch. Er wird bisher ja nicht erkannt.
"((.|\\s)*?)##" schien mir bisher am logischsten, funktioniert aber auch nicht...)


/edit: ok das Hauptproblem ist eher: wie bringe ich readLine() dazu, bis zum Zeilenende zu lesen, also Steuerzeichen zwischendurch trotzdem mitzunehmen?
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Anhand eines Beispiels (mit Erklärung: was willst du als Ergebnis, was bekommst du etc.) ist so etwas denke ich immer besser erklärt und andere können viel besser helfen.
/edit: ok das Hauptproblem ist eher: wie bringe ich readLine() dazu, bis zum Zeilenende zu lesen, also Steuerzeichen zwischendurch trotzdem mitzunehmen?
Von welchen Steuerzeichen reden wir hier?
readLine:
Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
Da kannst du nichts dran ändern. Wenn du also Zeilenumbrüche etc. "überlesen" möchtest bzw möchtest dass diese dann mit zu deinem String gehören und du eher bis zu den nächsten ## lesen willst (habe ich dich da überhaupt richtig verstanden?), würde ich dir den Scanner empfehlen mit DOTALL noch als Zusatz im Pattern, so dass wir dann also das Pattern "(?s)(.*?)##" haben.
Beispiel:
Java:
		String strLine = "one##two####three##\nhallo welt\nfoobar\ntwo##two##";
		Scanner sc = new Scanner(strLine); //hier dann natürlich nicht den Teststring nehmen, sondern dein File
		while(sc.findWithinHorizon("(?s)(.*?)##", 0) != null){
			String s = sc.match().group(1);
			System.out.println(Arrays.toString(s.toCharArray())); //nur für Testzwecke ums besser zu verdeutlichen
		}

Code:
\nhallo welt\nfoobar\ntwo##
sollte also als ein String erkannt werden ja?
 

membersound

Bekanntes Mitglied
Ja, du hast mich genau richtig verstanden, und es funktioniert auch schon echt gut, danke!

Einziges Problem ist noch, dass Steuerzeichen von der oberen Line in den neuen String mit reingeschleppt werden, zu sehen unten bei "String1":

Java:
public class testclass {
    public static void main(String args[]) throws UnsupportedEncodingException, FileNotFoundException {
        LineNumberReader strLine = new LineNumberReader(new InputStreamReader(new FileInputStream("testfile.txt"), "ISO-8859-1"));
        /*file contains:
         * my teststring##
         * one##two####three##\nhallo welt\nfoobar\ntwo##two##
         */
        Scanner sc = new Scanner(strLine);
        
        int i = 0;
        String[] s = new String[10];
        
        while (sc.findWithinHorizon("(?s)(.*?)##", 0) != null) {
            s[i] = sc.match().group(1);
            System.out.println("String" + i + ": " + s[i]);
            i++;
        }
    }
}

Output:
Code:
String0: my teststring
String1: 
one
String2: two
String3: 
String4: three
String5: \nhallo welt\nfoobar\ntwo
String6: two
 

eRaaaa

Top Contributor
Mhm? Verstehe ich nicht, das ist doch das was du wolltest (Steuerzeichen mit in den String). Ist doch klar dass dann wenn du ein line terminator vor dem one hast und dann println machst, dass die dann in zwei Reihen dargestellt werden.
Wenn das nicht gewünscht ist und du hinterher halt die line terminators doch löschen willst, musst du eben nochmal replace aufrufen oder so.(s.trim() evtl...) ..:bahnhof:???:L
 

membersound

Bekanntes Mitglied
Ja stimmt, mit trim() würde das gehen.

Das Problem ist halt, dass am Schluss jede Line ein bestimmtes Objekt repräsentieren wird. Und dafür müsste ich halt EndOfLine irgendwie erkennen. Deshalb hatte ich readLine() ursprünglich genutzt.

Also ich müsste halt noch irgendwie erkennen, dass nach "my teststring" eine newLine() beginnt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
K Probleme mit RegEx (Pattern und Matcher) Java Basics - Anfänger-Themen 2
S Regex Pattern Java Basics - Anfänger-Themen 3
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
M Regex-Pattern Java Basics - Anfänger-Themen 2
U Java Pattern Regex Java Basics - Anfänger-Themen 9
K Regex Pattern Java Basics - Anfänger-Themen 4
F regex pattern problem Java Basics - Anfänger-Themen 4
S Regex Pattern Problem Java Basics - Anfänger-Themen 2
O reguläre Ausdrücke bei java.util.regex.Pattern Java Basics - Anfänger-Themen 4
G Java Regex / Pattern etc. <-> Jakarta RegExp Java Basics - Anfänger-Themen 6
L Backslash als Pattern bzw. RegEx Java Basics - Anfänger-Themen 1
B Regex Order unwichtig bei Lookaheads? Java Basics - Anfänger-Themen 7
F RegEx Hilfe Java Basics - Anfänger-Themen 5
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
W RegEx Java Basics - Anfänger-Themen 4
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
X Wie kann man ein Regex erstellen, die 8-Bit-Binär-Zahlen darstellen. Java Basics - Anfänger-Themen 1
A Zusammengesetzte Nomen/Straßennamen mit Regex-Ausdrücken trennen Java Basics - Anfänger-Themen 8
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
H Java Regex Aufzählung kontrollieren Java Basics - Anfänger-Themen 3
Nooobi Regex und .matches() geben keine Ausnahme Java Basics - Anfänger-Themen 10
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
K Wie verneine ich einen Regex? Java Basics - Anfänger-Themen 2
L Hilfe bei RegEx Java Basics - Anfänger-Themen 4
Dimax RegEx Java Basics - Anfänger-Themen 10
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
O Regex bei ReplaceAll ersetzt Wort und Sonderzeichen nicht. Java Basics - Anfänger-Themen 9
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
L Regex issue Java Basics - Anfänger-Themen 4
B Regex Kombination benötigt Java Basics - Anfänger-Themen 5
strohkolben Regex Java Basics - Anfänger-Themen 3
OnDemand Regex oder Split? Java Basics - Anfänger-Themen 5
I String.split regex Frage Java Basics - Anfänger-Themen 2
C RegEx Problem Java Basics - Anfänger-Themen 4
Dimax RegEx funktionieren nicht Java Basics - Anfänger-Themen 7
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
K substitute mit regex Java Basics - Anfänger-Themen 10
G RegEx Java Basics - Anfänger-Themen 11
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
M Regex zum Integer.parseInt Java Basics - Anfänger-Themen 4
G Regex Java Basics - Anfänger-Themen 4
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
M Regex anpassen Java Basics - Anfänger-Themen 19
C Regex-Problem Java Basics - Anfänger-Themen 4
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
C Positive und negative Zahlen mit Regex extrahieren Java Basics - Anfänger-Themen 8
F RegEx für Email Java Basics - Anfänger-Themen 2
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
FelixN RegEx aus einem String als String-Array zurückgeben Java Basics - Anfänger-Themen 8
FelixN RegEx Erläuterung "ˆ[ˆa-zA-Z]+$" Java Basics - Anfänger-Themen 6
F Regex Hilfe Java Basics - Anfänger-Themen 3
I Regex findet keine Treffer Java Basics - Anfänger-Themen 4
C Regex Java Basics - Anfänger-Themen 2
C Probleme bei Regex Java Basics - Anfänger-Themen 9
B Regex ignorieren von Groß - Kleinschreibung Java Basics - Anfänger-Themen 1
F Regex für Inlineformatierungen Java Basics - Anfänger-Themen 12
W Einfachen, ein beliebiges Zeichen oft erkennenden Regex Parser selber schreiben - wie vorgehen? Java Basics - Anfänger-Themen 12
O Regex Java Basics - Anfänger-Themen 2
F Switch Case Problem mit Regex lösen? Java Basics - Anfänger-Themen 6
H regex-Problem Java Basics - Anfänger-Themen 2
F Ist das ein korrekter Regex-Ausdruck? Java Basics - Anfänger-Themen 12
M Zahlenbereich mit RegEx Java Basics - Anfänger-Themen 3
B Hilfe bei Regex - Erstellung Java Basics - Anfänger-Themen 5
D regex Aufbau Frage Java Basics - Anfänger-Themen 4
R Rechenzeichen als regex Java Basics - Anfänger-Themen 10
S Ich verstehe die RegEx Tabelle von Javadoc nicht so ganz Java Basics - Anfänger-Themen 3
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
F RegEx Problem Java Basics - Anfänger-Themen 8
F Regex Hilfe Java Basics - Anfänger-Themen 14
G String nach Contains/Regex Java Basics - Anfänger-Themen 2
U RegEx alle Kommas bei den Zahlen in Punkt umwandeln Java Basics - Anfänger-Themen 3
K RegEx - Multiple Line Java Basics - Anfänger-Themen 3
K Regex: illegal character range Java Basics - Anfänger-Themen 4
F RegEX Hilfe Java Basics - Anfänger-Themen 8
U Regex für kommaseparierte Zahlen Java Basics - Anfänger-Themen 1
K Operatoren Regex für 10er Zahlen Java Basics - Anfänger-Themen 8
V Java Regex richtig parsen Java Basics - Anfänger-Themen 2
E Brauche eine Antwort zum Thema RegEx ( Alternative zur Lösung auch gesucht ) Java Basics - Anfänger-Themen 5
N mein RegEx Java Basics - Anfänger-Themen 2
C Lösung für RegEx in Java gesucht Java Basics - Anfänger-Themen 2
B Java - Reguläre Ausdrücke - RegEx oder Regular Expressions - Eckige Klammern Java Basics - Anfänger-Themen 2
M Regex/matcher Java Basics - Anfänger-Themen 2
T Methoden String.matches() - Regex Java Basics - Anfänger-Themen 2
truesoul Regex für www Java Basics - Anfänger-Themen 0
N Methoden Straßennamen und Hausnummer - RegEx Java Basics - Anfänger-Themen 19
W Erste Schritte Regex negieren Java Basics - Anfänger-Themen 3
W String match mit Wildcard ODER Regex Java Basics - Anfänger-Themen 1
E useDelimiter-Anwednung / Regex Java Basics - Anfänger-Themen 2
C java regex Java Basics - Anfänger-Themen 2
C Regex zum matchen ausserhalb von Tags Java Basics - Anfänger-Themen 3
O Regex zwischenspeichern Java Basics - Anfänger-Themen 6
O Regex Java Basics - Anfänger-Themen 5
R Einfacher Regex Java Basics - Anfänger-Themen 3
V RegEx Java Basics - Anfänger-Themen 15
HoloYoitsu Datentypen replaceAll() mit regex? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben