Regex mit Umlauten

werdas34

Bekanntes Mitglied
Hallo,

ich brauche etwas Unterstützung bei einem RegEx.
Ziel ist einen Text auf einen Substring zu überprüfen, und wenn dieser Substring vorkommt, soll das Wort als ganzes zurückgegeben werden.
Text kann alles sein, Doku, Quellcode, Konfigurationsdatein. Daraus kann kein Muster erschlossen werden. Das extrahierte Wort soll ohne Sonderzeichen und aus dem deutschem Alphabet (mit Umlaut und ß) bestehen.

Der bisherige RegEx scheint nicht so ganz zu funktionieren.
Auskommentiert ist die erwartete Lösung und unten der tatsächliche Output.
Wie man erkennt machen oft die Umlaute Probleme, aber auch nicht immer. "seiner" und "useiwsaö" werden gar nicht gefunden.

Java:
public class Renamer {
    public static void main(String[] args) {
        String text = "Das soll so sein.\"seinetwegü&en so <äzuse-123 <AeDwertse! ?seiner_ .seiöner_ ID_useiwsaö_ps -gfserTßz-";
        // sein
        // seinetwegü&en
        // äzuse
        // AeDwertse
        // seiner
        // seiöner
        // useiwsaö
        // gfserTßz
        String substring = "se";
        List<String> matchingWords = findWordsContainingSubstring(text, substring);

        for (String word : matchingWords) {
            System.out.println(word);
        }
    }

    public static List<String> findWordsContainingSubstring(String text, String substring) {
        String regex = "\\b[a-zA-ZäöüÄÖÜß]*" + Pattern.quote(substring) + "[a-zA-ZäöüÄÖÜß]*\\b";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);

        List<String> matchingWords = new ArrayList<>();
        while (matcher.find()) {
            matchingWords.add(matcher.group());
        }
        return matchingWords;
    }
}

Code:
sein
seinetweg
zuse
AeDwertse
seiö
gfserTßz
 

Oneixee5

Top Contributor
Evtl.:
Java:
return Arrays
    .stream(text.split("[\\s\\./\"\\-_<\\?]+"))
    .filter(s -> s.contains(substring))
    .toList();
 

Oneixee5

Top Contributor
Ist mir gerade noch eingefallen... Es geht vermutlich noch besser:
Java:
        return Arrays
            .stream(text.split("[\\s\\p{Punct}&&[^&]]+"))
            .filter(s -> s.contains(substring))
            .toList();
 

werdas34

Bekanntes Mitglied
Danke für deine Ideen.
Du versuchst es quasi andersherum. Alle nicht gewünschten Zeichen aufräumen.
Den Ansatz habe ich auch schon verfolgt, aber wieder verworfen, da der Textinput wirklich alles sein kann. Und weil ich jedes Sonderzeichen extra angeben müsste (schlechte Lesbarkeit).

Hätte jetzt aufbauend auf deinem, das hier probiert.
Java:
        return Arrays
                .stream(text.split("[^a-zA-ZäüöÄÜÖß]+"))
                .filter(s -> s.contains(substring))
                .toList();
So muss ich nicht alle Sonderzeichen angeben, die gefiltert werden sollen. Klappt auch besser als davor.

Siehst du irgendwo Probleme die ich bekommen könnte?
 

Oneixee5

Top Contributor
Dein Problem ist u.a. /b
Word bundary - endet quasi bei verschiedenen Zeichen. Somit bekommst du kein Wort, welches bspw. ein & enthält.
 

werdas34

Bekanntes Mitglied
Ja das word boundary hat mir anfänglich Probleme bereitet, da unter anderem 0-9 und _ als Wortzeichen zählen.

Bei einem & würden mich nur das Wort davor und das Wort danach interessieren. Eins&Zwei -> [Eins, Zwei]
 

Oneixee5

Top Contributor
Vermutlich muss die Anforderung besser beschrieben werden. Es wird laut #1 folgende Ausgabe erwartet:
Java:
        // sein
        // seinetwegü&en
        // äzuse
        // AeDwertse
        // seiner
        // seiöner
        // useiwsaö
        // gfserTßz
Jetzt schreibst du aber:
Bei einem & würden mich nur das Wort davor und das Wort danach interessieren.
Was ist jetzt richtig: seinetwegü&en oder [Eins, Zwei]?

Die Folge: [a-zA-Z] ist erst mal überflüssig und unperformant. Man kann Regex einfach auf 'ignore case' stellen, damit muss hier nur die Hälfte der Fälle geprüft werden: [a-z].

Du möchtest aber selbst Satzzeichen mit in die Trenner einbeziehen. Also kannst du jetzt \s und eine Zeichengruppe, welche Satzzeichen enthält verwenden. das wäre dann: [\\s\\p{Punct}]+ - aber dein Beispiel: // seinetwegü&en also [\\s\\p{Punct}&&[^&]]+.

Offensichtlich bist du damit aber nicht zufrieden. Jetzt wäre also der Moment, deine Beschreibung zu überdenken. Wenn jemand in seiner Beschreibung das Wort
verwendet, dann ist eigentlich schon klar, dass die Beschreibung falsch ist. Es ist niemals wirklich 'alles' gemeint - hier bspw. Whitespaces würden imho auch zu 'alles' gehören - also müsste man garnichts trennen.
 

werdas34

Bekanntes Mitglied
Ja das seinetwegü&en sollte statt dem & ein ß enthalten. Ist mir durch die ganzen Buchstaben nicht mehr aufgefallen. Sorry.

Ich hatte im Eingangspost auch formuliert:
Das extrahierte Wort soll ohne Sonderzeichen und aus dem deutschem Alphabet (mit Umlaut und ß) bestehen.
Aber verstehe die Irritation.

Das mit den ignoreCase beim Regex ist interessant. Habe ich mir notiert.
Ist das mit dem ignoreCase wirklich effizienter? Schließlich muss dennoch auf Klein- bzw Großbuchstaben abgeglichen werden?
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Ich verstehe das Problem nicht ganz. Du definierst ein Wort als Folge von Zeichen, die dem deutschen Alphabet entsprechen. Damit hat es sich doch aber auch schon, oder sehe ich hier was falsch?

Im Übrigen ist "[A-Za-zÄÖÜẞäöüß]" nicht identisch mit "(?i)[a-zäöüß]":

ZeichentoLowerCasetoUpperCaseRegex
ß (kleines Eszett)ß (kleines Eszett)SS(?i)[ß] matched nur ß, nicht aber SS oder ẞ (großes Eszett)
ẞ (großes Eszett)ß (kleines Eszett)ẞ (großes Eszett)(?i)[ẞ] matched nur ẞ, nicht aber ß (kleines Eszett)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Anfänger Regex Java Basics - Anfänger-Themen 4
G Regex greift nicht richtig Java Basics - Anfänger-Themen 4
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
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
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
S Regex Pattern 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
G regex Verständnis Problem Java Basics - Anfänger-Themen 3
G verwendung von regex Java Basics - Anfänger-Themen 3
X Regex splitten Java Basics - Anfänger-Themen 5
T Regex Problem Java Basics - Anfänger-Themen 4
B String nach regex überprüfen Java Basics - Anfänger-Themen 6
J Regex Ausdrücke im Array - Wieso werden sie nicht erkannt? Java Basics - Anfänger-Themen 4
N Regex Java Basics - Anfänger-Themen 4
F String.replaceAll() funktioniert nicht richtig oder habe ich den falschen Regex?? Java Basics - Anfänger-Themen 3
J Regex mit Return Java Basics - Anfänger-Themen 3
I Rechenoperatoren mit Regex splitten Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben