RegEx funktionieren nicht

Dimax

Top Contributor
Hallo, ich habe ein kleines Problem mit RegEx.
Ich habe eine Classe mit einer Methode ,welche mir je nach Ergebnis einen String zurückliefert:
Java:
import java.util.regex.Pattern;

public class KatGetter {
    public static String getKategorie(String kategorie){
    
        String regDat="(?i)(\\W|^|.*)data\\s{0,3}scientist|data\\s{0,3}analyst|"+
                      "biostatistiker|data\\&{0,3}analyst(\\W|$)";
        String regAdmin="(?i)(\\W|^|.*)admin(\\W|$|.*)";
        String regAnalyst="(?i)(\\W|^|.*)analyst(\\W|$|.*)";
        String regArchitekt="(?i)(\\W|^|.*)architekt(\\W|$|.*)";
        String regConsult="(?i)(\\W|^|.*)berater|consultant(\\W|$|.*)";
        String regEntwickl="(?i)(\\W|^|.*)entwickl|develop(\\W|$|.*)";
        String regEngin="(?i)(\\W|^|.*)engineer|ingenieur(\\W|$|.*)";
        String regTester="(?i)(\\W|^|.*)test(\\W|$|.*)";
        String regTrain="(?i)(\\W|^|.*)trainer|coach(\\W|$|.*)";
        String kat="";
        if(Pattern.matches(regDat, kategorie)){
            kat=kat.concat("Data Scientist,");
            System.out.println(kat);
        }
        if(Pattern.matches(regAdmin, kategorie)){
            kat=kat.concat("Administrator,");
            System.out.println(kat);
        }
        if(Pattern.matches(regAnalyst, kategorie)){
            kat=kat.concat("Analyst,");
            System.out.println(kat);
        }
        if(Pattern.matches(regArchitekt, kategorie)){
            kat=kat.concat("Architekt,");
            System.out.println(kat);
        }
        if(Pattern.matches(regConsult, kategorie)){
            kat=kat.concat("Consultant,");
            System.out.println(kat);
        }
        if(Pattern.matches(regEntwickl, kategorie)){
            kat=kat.concat("Entwickler,");
            System.out.println(kat);
        }
        if(Pattern.matches(regEngin, kategorie)){
            kat=kat.concat("Engineer,");
            System.out.println(kat);
        }
        if(Pattern.matches(regTester, kategorie)){
            kat=kat.concat("Tester,");
            System.out.println(kat);
        }
        if(Pattern.matches(regTrain, kategorie)){
            kat=kat.concat("Trainer,");
            System.out.println(kat);
        }else{System.out.println(kategorie);}
        return kat;
    }

}
Das funktioniert aber nicht,weil manche Wörter werden nicht abgefangen.
 
Und was sollen wir jetzt tun? Meine Glaskugel ist kaputt.

Hint:
Manche werden nicht abgefangen ist keine saubere Fehlerbeschreibung. Das ist ähnlich sinnvoll wie "Mein Auto macht nicht was es soll".

Was soll die Funktion tun? "Je nach Ergebnis einen String zurücklieferen" ist keine Beschreibung der Funktion. Die Funktion liefert einen String zurück, also tut sie das was sie soll.

Du musst schon angeben:
* Was soll die Funktion genau tun - wann soll warum was kommen
* Bei welcher Eingabe kommt was für ein falsches Ergebnis und was wäre das erwartete richtige Ergebnis.
 
Es gibt keine Fehlermeldungen,deswegen vermute ich ,dass die RegEx falsch sind.Das Problem ist ,das im String werden manche Wörter nicht gefunden.Die Regex habe ich online getestet,war alles in Ordnung.
Zmb.im Satz:
ServiceManager,Consultant(m/w/d)...vonAlternativenBewertungderReportsfürdasKapazitätsmanagement
sollte if(Pattern.matches(regConsult, kategorie)){ true sein..macht es aber nicht ,entweder regex falsch oder wird übersprungen.
 
Also generell sind Deine Regulären Ausdrücke so nicht wirklich sinnvoll.

(?i) -> ok, Du willst nicht mehr case sensitive sein.
(\\W|^|.*) -> Was willst Du erreichen? Das ist ja ein oder - wobei das letzte Element .* ist, was für wirklich beliebiges steht. Das umfasst also auch die vorherigen Dinge und ein .* könnte man statt dessen einsetzen.

Dann hast Du da ein |, das alles trennt, also entweder du hast das (\\W|^|.*)data\\s{0,3}scientist oder data\\s{0,3}analyst oder ... oder data\\&{0,3}analyst(\\W|$) ==> Willst Du da evtl. auch einen Block haben, so dass am Anfang das (\\W|^|.*) und am Ende das (\\W|$) für alles gilt?

Das nur einmal, was mir so auf Anhieb auffällt.
 
Mit (\\W|^|.*) am Anfang und mit(\\W|$) am Ende möchte ich dass das gesuchte Wort am Satzanfang,1wConsultant,,, und hier auch also überall gefunden wird.
 
Es gibt keine Fehlermeldungen,deswegen vermute ich ,dass die RegEx falsch sind.Das Problem ist ,das im String werden manche Wörter nicht gefunden.Die Regex habe ich online getestet,war alles in Ordnung.
Zmb.im Satz:
ServiceManager,Consultant(m/w/d)...vonAlternativenBewertungderReportsfürdasKapazitätsmanagement
sollte if(Pattern.matches(regConsult, kategorie)){ true sein..macht es aber nicht ,entweder regex falsch oder wird übersprungen.
Also nur einfach einmal für Dich zum Testen wäre meine Empfehlung, einfach ein kleines Testprogramm zu bauen, also sowas wie hier:
Java:
    public static void main(String[] args) {
        String pattern = "(?i).*(berater|consultant).*";
        String value = "ServiceManager,Consultant(m/w/d)";
        boolean result = Pattern.matches(pattern, value);
        System.out.println("Pattern.matches(" + pattern + ", " + value + ") = " + result);
    }

Den Regex habe ich etwas angepasst - also den Ausdruck am Anfang und am Ende habe ich zu .* vereinfacht und um die Auswahl habe ich Klammern gemacht -> Das scheint erst einmal zu machen, was Du erwartest.

Was Deine Tests woanders angeht (z.B. bei https://regex101.com/): Pattern.matches will einen kompletten Match haben. Also das Pattern entspricht sozusagen ^Pattern$. Ein patten von "(?i)(berater|consultant)" würde false ausgeben - aber bei regex101 würde dir der Match selbst angezeigt - aber eben nicht als kompletter Match.
 
Mit (\\W|^|.*) am Anfang und mit(\\W|$) am Ende möchte ich dass das gesuchte Wort am Satzanfang,1wConsultant,,, und hier auch also überall gefunden wird.
Du gibst mit etwas und ich prüfe:
Ist es ein 10€ Schein oder ist es ein 20€ Schein oder ist es einfach irgendwas oder nichts: Da machen die ersten Kriterien doch keinen Sinn!
a || b || true -> so a und b nichts aktives sind, die Du gerne ausführen möchtest: Dieser Ausdruck macht keinen Sinn, da er immer wahr ist.
 
Danke schon,jetzt geht's. Ich dachte das .* fängt nicht ab ,wenn das gesuchte Wort am Satzanfang oder am Satzende ist.
 

Neue Themen


Zurück
Oben