Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Für allgemeine Fragen zur Programmierung mit PureBasic.
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Beitrag von fabulouspaul »

Hallo Gemeinde,

ich möchte mit einem regulären Ausdruck einen Text nach bestimmten Begriffen durchsuchen.
Eigentlich ganz einfach, aber ich stosse an eine Grenze, wenn die Begriffe Umlaute am Anfang oder Ende haben. Offensichtlich wertet "\b" als Wortbegrenzung einen Umlaut ebenfalls als Wortgrenze:

Code: Alles auswählen

EnableExplicit

Global regex
Global text.s

text = "Kühlmittel, Brötchen, Märchen, Übernahme, Örtlich, Ärger, Müüü"

regex = CreateRegularExpression(#PB_Any, "\b([a-zA-Z0-9äöüßÄÖÜ]+)\b")
If regex 
  ExamineRegularExpression(regex, text)
  While NextRegularExpressionMatch(regex)
    Debug RegularExpressionMatchString(regex)
  Wend
  FreeRegularExpression(regex)
EndIf

End
Beim googlen habe ich etwas davon gefunden, dass man mit "Set Locale" etwas einstellen kann, aber wie mache ich das?
Oder hat jemand eine bessere Idee für einen passenden regulären Ausdruck.
Eine Suche OHNE regulären Ausdruck möchte ich auf Grund der Flexibilität vermeiden.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Beitrag von STARGÅTE »

Du brauchst gar kein \b weil ja das Word automatisch endet, wenn keines der Zeichen [a-zA-Z0-9äöüßÄÖÜ]+ vorkommt.

Code: Alles auswählen

EnableExplicit

Global regex
Global text.s

text = "Kühlmittel, Brötchen, Märchen, Übernahme, Örtlich, Ärger, Müüü"

regex = CreateRegularExpression(#PB_Any, "[a-zA-Z0-9äöüßÄÖÜ]+")
If regex 
  ExamineRegularExpression(regex, text)
  While NextRegularExpressionMatch(regex)
    Debug RegularExpressionMatchString(regex)
  Wend
  FreeRegularExpression(regex)
EndIf

End
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Beitrag von fabulouspaul »

Danke STARGÅTE, manchmal sieht man den Wald vor lauter Bäumen nicht! :allright:
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Beitrag von Nino »

STARGÅTE hat geschrieben:Du brauchst gar kein \b weil ja das Word automatisch endet, wenn keines der Zeichen [a-zA-Z0-9äöüßÄÖÜ]+ vorkommt.
Das stimmt. Der Nachteil bei dieser Lösung ist allerdings, dass sie nicht mehr funktioniert, sobald in der Wortliste ein Buchstabe vorkommt, der in dem verwendeten Regulären Ausdruck nicht enthalten ist. Wenn man die Beispiel-Wortliste z.B. um "Charité" ergänzt, wird dies deutlich.
Unicode Categories hat geschrieben:In addition to complications, Unicode also brings new possibilities. One is that each Unicode character belongs to a certain category. You can match a single character belonging to the "letter" category with \p{L}.
https://www.regular-expressions.info/unicode.html

Daher finde ich zur allgemeinen Verwendung folgende Lösung besser:

Code: Alles auswählen

EnableExplicit

Define regex, text.s

text = "Kühlmittel, Brötchen, Märchen, Übernahme, Örtlich, Ärger, Müüü, Charité"

regex = CreateRegularExpression(#PB_Any, "\p{L}+")
; Oder, wenn auch Ziffern eingeschlossen sein sollen:
; regex = CreateRegularExpression(#PB_Any, "[\p{L}\p{N}]+")

If regex
  ExamineRegularExpression(regex, text)
  While NextRegularExpressionMatch(regex)
    Debug RegularExpressionMatchString(regex)
  Wend
  FreeRegularExpression(regex)
EndIf
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Beitrag von fabulouspaul »

Guter Hinweis!
Und es funktioniert auch mit UTF-8 codierten Texten. :allright:
dadri
Beiträge: 1
Registriert: 19.10.2021 23:14

Re: Reguläre Ausdrücke Wortgrenzen (\b) mit Umlauten

Beitrag von dadri »

Falls sich jemand fragt, wie man trotzdem Wortgrenzen erkennt, wäre mein Vorschlag:

Code: Alles auswählen

/(^[\p{L}])|(\P{L}[\p{L}])/gmu
Ich nutze den Ausdruck, um alle Wortanfänge zu finden.
Mit \b und Umlauten im Wort wird leider vor und nach dem Umlaut immer eine Wortgrenze erkannt.
Antworten