Ich habe einen komplexen vorkompilierten regulären Ausdruck in Perl. In den meisten Fällen ist der Regex in Ordnung und entspricht allem, was er sollte und nichts, was er nicht sollte. Außer einem Punkt.
Grundsätzlich sieht meine Regex wie folgt aus:
%Vor% Leider stimmt m/\b\*\b/
nicht mit example, *
überein. Nur m/\*/
wird tun, was ich wegen falscher Positives nicht verwenden kann. Gibt es eine Problemumgehung?
aus den Kommentaren - falsch positive Werte sind: **
, example*
, exam*ple
Wofür ist die Regex gedacht? - Es sollte Schlüsselwörter (eines ist ein einzelnes Sternchen) extrahieren, die Mitarbeiter in Produktdaten eingegeben haben. Das Ziel besteht darin, diese Informationen aus einem Freetext-Feld in ein atomares Feld zu verschieben.
Das Problem ist, dass Perl *
nicht als "Wortzeichen" betrachtet und somit keine Wortgrenze zwischen einem Leerzeichen und einem Sternchen erkennt (obwohl es eines zwischen ihnen erkennt) die r
und die *
in foobar*
).
Die Lösung besteht darin, zuerst zu entscheiden, was Sie tun möchten, dass "Wort" - und "Nicht-Wort" -Zeichen berücksichtigt werden, und dann explizit danach suchen. Zum Beispiel, wenn Sie möchten, dass Ihre Wörter nur aus den Buchstaben 'A' bis 'Z' (oder ihren Kleinbuchstaben) und *
bestehen und alles andere als Nicht-Wort-Zeichen behandelt wird , können Sie verwenden:
Dies entspricht den Zeichenfolgen FOO
, BAR
oder *
, vorausgesetzt, dass ihnen kein Zeichen vorangestellt oder gefolgt wird, das [A-Za-z*]
entspricht.
Wenn Sie beispielsweise alles außer Leerzeichen als Nicht-Wort-Zeichen betrachten möchten, könnten Sie Folgendes verwenden:
%Vor%, das mit FOO
, BAR
oder *
übereinstimmt, vorausgesetzt, dass ihnen kein Leerzeichen vorangeht oder folgt.