String/Spalte auf Regex prüfen

Hallo,

wie genau muss ich vorgehen, wenn ich ein Spreadsheet darauf filtern will, ob eine bestimmte Zeile eine Regex erfüllt?


Hab ich noch nie gemacht, spontaner Ansatz: Funktion > Suchen & Ersetzen, Regex aktivieren, ersetzen mit einem "unnatürlichen" String wie "#FOUND#", dann Hilfspalte die per ?contains prüft ob der Found-String ersetzt wurde, dafür was auswerfen, auf das ich dann mit einem Filter filtere. Gehts einfacher/eleganter?


Bonusfrage: hat jemand spontan ne elegante Regex für "Mindestens 2 Ziffern, gefolgt von einem oder keinem Leerzeichen, gefolgt von ein order zwei Buchstaben, gefolgt von Satzzeichen oder Leerzeichen oder Wortende"?


Was ich konkret machen will ist Artikelnamen prüfen ob sie einen Inhaltsstring enthalten, der darauf hinweist, dass hier eine Grundpreis-Anzeige nötig ist. Statt "einem oder zwei Buchstaben" wären also auch die gültigen Werte "l", "ml", "g" und "kg" möglich, wär sogar präziser.


Erstmal muss ich aber wissen wie ich überhaupt die Regex auf den String werfe, bzw in welchem Format:


Spontan hab ich mir mal

(^|\b\s+|\b)(\d+\s+|\d+)

zusammengebastelt. Das ist "Zahl gefolgt von Leerzeichen oder Buchstaben", aber das bekomm ich *auch* nicht zum laufen. Bzw es ersetzt nichts, für Strings, für die Regexr.com Treffer meldet. Irgendwo hängt ich...


Danke, Daniel



Hallo Daniel,


zu Deiner Bonusfrage: Probier mal

(.*?[^0-9]*)([0-9]{2,})([ ]{0,1})([A-Za-z]{1,2})([.,;!/?]{0,1})


Nur die Sache mit dem Wortende müßtest Du Dir nochmal ansehen


Gruß Micha

Hallo Daniel,


dafür kannst du die Freemarker Methode "matches" verwenden.


${"fooo"?matches('foo*')}


Würde "true" ausgeben, da der Ausdruck in der Klammer auf den angegebenen String zutrifft. Genau so gut kannst du eine regex Pattern verwenden und dann nach "true" filtern. Mach das am besten in einer Hilfsspalte.

Eine nähere Erklärung findest du hier: https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_matches


Bei der Bonusfrage gehe ich einfach mal davon aus, dass dir Micha da weiter geholfen hat.

Danke Micha.


Viele Grüße,

Lukas

Hi Lukas, ja matches() ist genau was ich gesucht hab, super!


Regex von Micha hat leider nur gematcht wenn direkt danach das Wortende kommt, nicht wenn der String noch weiter geht. Auf Regexr.com hat es wie gepostet gepasst, im Java-Regex-Format das ihr verwendet nicht... (vermute daran liegts?)

Bisschen eingekürzt hinten gehts jetzt wie gewünscht:

(.*?[^0-9]*)([0-9]{2,})([ ]{0,1})([A-Za-z]{1,2}).*

Danke euch Beiden! Grüße Daniel

Nah das tut auch nicht, das erwischt ja viel zu viel. \b statt .* natürlich. Gute Nacht/Morgen :)

Hallo Daniel,


ich bin leider nicht so bewandert in regex, deshalb habe ich gehofft, das Michas Beitrag deine Lösung war. Aber danke, dass du deine finale Lösung nochmal nachgetragen hast.


Viele Grüße,

Lukas