Regular Expression

J0sh

Mitglied
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:
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!
 
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 ...
 
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?🙂
 
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})"
 
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?
 
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();
            
        }
 
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.
 
ahja das habe ich mit dem Debugger gerade auch gemerkt ... eigentlich soll der inputString jede Zeile lesen und nach dem regulären Ausdruck suchen ...🤔
 
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)..
 

Zurück
Oben