Regular Expression

Diskutiere Regular Expression im Allgemeine Java-Themen Bereich.
J

J0sh

Hallo zusammen,

kennt sich irgendeiner von euch mit regulären Ausdrücken in Java aus?
Ich soll mithilfe der Matcher und Pattern-Klasse einen regulären Ausdruck schreiben, der in einem String die gezeigte Warnung findet.
Java:
        String newWarning = "Warning 552 of 731:\n"
                + " \n"
                + "in module DOM.Node.Types\n"
                + "at home/.../Types.purs line 8, column 1 - line 10, column 1\n"
                + "    Import uses the deprecated 'qualified' syntax: \n";
        
        Pattern p = Pattern.compile("(?<Datei>/?[a-z]{4}/?[.*]{1,}/?[A-Z]{1}[a-z]+.[a-z]{1,4})");
        //(?<WarningNummer>[0-9]{1,3}) -> Soll 552 ausgeben
        // (?<Datei>/?[a-z]{4}/?[.*]{1,}/?[A-Z]{1}[a-z]+.[a-z]{1,4}) -> soll home/.../Types.purs ausgeben
        //(?<Zeile>[0-9]{1,3} -> Soll 8 ausgeben
        Matcher m = p.matcher(newWarning);
        System.out.println(m.groupCount());
        
        
        if(m.find()) {
            System.out.println(m.group("Datei")); //home.../Types.purs
            //System.out.println(m.group("WarningNummer")); //552
            //System.out.println("Zeile");
Ich muss ich aber einen regulären Ausdruck schreiben und sie mit der Capturing group extrahieren ... Nur wird leider nichts mehr angezeigt wenn ich einen regulären Ausdruck habe ...
 
Zuletzt bearbeitet:
F

fhoffmann

Was ist denn (in einem Java-String) /??
Ein Backslash ist ein Sonderzeichen in einem regulären Ausdruck und ein Sonderzeichen in eunem java.lang.String!
 
J

J0sh

Wenn ich z.B. die capture group Datei in den Pattern compiler stecke, findet es die Datei "home/.../Types.purs" und auch die Nummer der Warnung 552, wenn ich aber nur die capture group reinstecke ... aber es soll ja ein einziger regulärer Ausdruck sein ... Und wenn ich beide bzw. alle in den patterncompiler stecke, wird nichts mehr angezeigt ...
 
mihe7

mihe7

Schreib mal am Anfang Deines Ausdrucks (?s), damit der Punkt auch Zeilenumbrüche einschließt.
 
J

J0sh

Schreib mal am Anfang Deines Ausdrucks (?s), damit der Punkt auch Zeilenumbrüche einschließt.
Java:
    public static void main(String[] args) throws IOException {
        
    
    
        String newWarning = "Warning 552 of 731:\n"
                + " \n"
                + "in module DOM.Node.Types\n"
                + "at home/.../Types.purs line 8, column 1 - line 10, column 1\n"
                + "    Import uses the deprecated 'qualified' syntax: \n";
        
        Pattern p = Pattern.compile("(?s)(?<WarningNummer>[0-9]{1,3}(?<Datei>/?[a-z]{4}/?[.*]{1,}/?[A-Z]{1}[a-z]+.[a-z]{1,4}))");
        //(?<Datei>/?[a-z]{4}/?[.*]{1,}/?[A-Z]{1}[a-z]+.[a-z]{1,4})(?<Zeile>[0-9]{1,3}
        Matcher m = p.matcher(newWarning);
        System.out.println(m.groupCount());
        
        
        if(m.find()) {
            System.out.println(m.group("Datei")); //home.../Types.purs
            System.out.println(m.group("WarningNummer")); //552
            //System.out.println("Zeile");
            
            
        }
meinst du so?:)
 
mihe7

mihe7

Ja, der reguläre Ausdruck ist aber nicht korrekt. Der müsste eher so in der Richtung aussehen (Achtung: kann Fehler enthalten):

"(?s)Warning\\s+(?<WarningNummer>[0-9]{1,3}).*at\\s+(?<Datei>/?[a-z]{4}/?[.*]{1,}/?[A-Z]{1}[a-z]+.[a-z]{1,4})\\s+line\\s+(?<Zeile>[0-9]{1,3})"
 
J

J0sh

Ja, der reguläre Ausdruck ist aber nicht korrekt. Der müsste eher so in der Richtung aussehen (Achtung: kann Fehler enthalten):

"(?s)Warning\\s+(?<WarningNummer>[0-9]{1,3}).*at\\s+(?<Datei>/?[a-z]{4}/?[.*]{1,}/?[A-Z]{1}[a-z]+.[a-z]{1,4})\\s+line\\s+(?<Zeile>[0-9]{1,3})"
Hat zumindest die Warnung Nr. 552 und die Datei ausgegeben ... dankeschön! :) was genau hast du eigentlich hinzugefügt, dass der Ausdruck gepasst hat?
 
J

J0sh

Vergleich die Strings miteinander.
super vielen Dank!
Nun muss ich eine Datei in einem String einlesen und alle Warnungen finden, und diese müssen wir dann zählen:
Man muss auch drauf achten, dass die Zeilenumbrüche nicht verloren gehen.
Mein Ansatz müsste eigentlich in etwa stimmen, aber es wird leider nichts ausgegeben ...

Java:
BufferedReader input = null;
        String inputString = null;
        int counter =0;

try {
            input = new BufferedReader(new FileReader("build.log"));
            inputString = input.readLine() + "\n";
            m = newp.matcher(inputString);
            while (inputString != null) {
                m.reset(inputString);
                if(m.find()) {
                    System.out.println("Warning " + m.group("Datei") + " at line " + m.group("Datei") + " in file " + m.group("Zeile"));
                    counter+=1;
                    System.out.println(counter);
                }
                
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            
        }
 
mihe7

mihe7

Du liest ja nur eine Zeile und wendest dann den regulären Ausdruck darauf an. Das wird nicht funktionieren. Wenn Du Dein vorheriges Beispiel nimmst, würde z. B. "Warning 552 of 731:" gelesen. Das entspricht natürlich nicht dem regulären Ausdruck.
 
J

J0sh

ahja das habe ich mit dem Debugger gerade auch gemerkt ... eigentlich soll der inputString jede Zeile lesen und nach dem regulären Ausdruck suchen ...🤔
 
J

J0sh

Um die nächste Zeile(n)zu lesen, braucht es doch wieder einen input.readLine()-Aufruf am Ende der while-Schleife oder?
 
mihe7

mihe7

Die Frage ist, ob Du die ganze Datei einlesen sollst bzw. darfst. Dann kannst Du das per readLine() machen. Wenn Du noch am Anfang stehst, kannst Du per inputString = inputString + input.readLine() + "\n" (bzw. kurz inputString += input.readLine() + "\n") die neue Zeile hinten "anfügen" (tatsächlich wird immer ein neuer String erstellt, weshalb das Vorgehen höchstens am Anfang zu empfehlen ist)..
 
Thema: 

Regular Expression

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben