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:

fhoffmann

Top Contributor
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!
 

J0sh

Mitglied
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 ...
 

J0sh

Mitglied
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

Top Contributor
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})"
 

J0sh

Mitglied
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?
 

J0sh

Mitglied
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

Top Contributor
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.
 

J0sh

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

mihe7

Top Contributor
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)..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Regular Expression Allgemeine Java-Themen 11
M Regular expression Allgemeine Java-Themen 5
B Regular Expression und Matcher Allgemeine Java-Themen 3
MrMilti Gruppenreferenz in einer Regular Expression Allgemeine Java-Themen 3
S Java Regular Expression Allgemeine Java-Themen 2
G Parameterauswertung mit regular Expression Allgemeine Java-Themen 3
M Java Regular Expression für Mathe-String (= 2+4*3+2) Allgemeine Java-Themen 7
G Regular Expression Allgemeine Java-Themen 8
D Regular Expression Mit Punkt und Zahl Allgemeine Java-Themen 4
T Regular Expression mit n Gruppen Allgemeine Java-Themen 6
M Regular Expression Allgemeine Java-Themen 2
R Regular expression für '.' Allgemeine Java-Themen 7
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
H Regular Expressions: beste Methode? Allgemeine Java-Themen 5
S Java Regular Expressions Allgemeine Java-Themen 2
S Regular Expressions in Java Allgemeine Java-Themen 3
MQue Regular Expr Allgemeine Java-Themen 15
G Regular expressions Allgemeine Java-Themen 4
M Mal wieder . Regular Expressions Allgemeine Java-Themen 2
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
RalleYTN Expression Crawling Allgemeine Java-Themen 5
D Variablen C Expression Validator Allgemeine Java-Themen 7
J Expression Language für mathematische Ausdrücke Allgemeine Java-Themen 8
S Syntax Error, insert "AssignmentOperator Expression&amp Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben