Übereinstimmender Wert in gelistetem Zellenbereich finden

Ich scheitere daran, ein typografisches Wort oder einen mathematischen Wert in einer separaten Bereichs-Liste (Zeile oder Spalte) zu finden. CALC (und WRiTER) sucht ganz pragmatisch Zeichen auf Zeichen nach Muster, dumm wie jede Mikrocontroller-Programmierung.


Beispiel:
Ich will wissen, ob der Inhalt einer Zelle mit dem Inhalt eines Bereichs übereinstimmt, zB.: die gelistete Zahl „123“ oder Text „Abc“ ist als Zeichenfolge zwar in variabler Eingabe-Zelle mit Inhalt „0123abc456“ enthalten (CALC gibt TRUE aus), was vom Wert jedoch FALSE ist und nicht gewünscht, da ich explizit nach „123“ bzw. „Abc“ suche auch als Teil im Satz.
Die Suche schlägt vollkommen fehl, wenn ich fortlaufende Zahlen eingebe ab bspw. 100, 101, 102, … und die Liste beinhaltet 1…99!


hier meine Trial-and-Error-Tabelle:
TESTESTEST-v0000.ods (28.8 KB)
TESTESTEST-v0000.pdf (90.2 KB)


siehe ähnliches Thema:

t98354.ods (28.1 KB)

Wenn man REGEX() benutzt, muss man genau verstehen, wie regular expressions funktionieren. Natürlich matcht 121|121-A|122|123|124|124-A|X124|222(1)|222(11)|TEXT|TEST|– den String 121999 oder 999121 weil 121 dort enthalten ist. Wenn du einen exakten match willst, müsste die expression verankert werden also ^(121|121-A|122|123|124|124-A|X124|222(1)|222(11)|TEXT|TEST|–)$ lauten, also "^("&TEXTJOIN("|";1;AA$7:AA$19)&")$". In diesem Fall ist aber außerdem auch das Problem, dass in 222(1) und 222(11) bereits capturing parentheses enthalten sind, die nicht literal gematcht werden. Also müssen die einzelnen Bestandteile quoted sequences werden, indem sie in \Q und \E eingeschlossen werden,
^(\Q121\E|\Q121-A\E|\Q122\E|\Q123\E|\Q124\E|\Q124-A\E|\QX124\E|\Q222(1)\E|\Q222(11)\E|\QTEXT\E|\QTEST\E|\Q–\E)$
also "^(\Q"&TEXTJOIN("\E|\Q";1;AA$7:AA$19)&"\E)$"
womit z.B. B9 wird

=IF(ISERROR(REGEX(A9;"^(\Q"&TEXTJOIN("\E|\Q";1;AA$7:AA$19)&"\E)$"));AD$8;AD$7)

Aber das wiederum läuft Zeile 14 zuwider, wo du anscheinend in – – – finden willst, oder Zeilen 16 bis 18 wo TEXT etc. gefunden werden soll. Du musst dich schon irgendwie entscheiden, wie rum die Suche erfolgen soll… oder ich verstehe einfach nicht, was du willst.

Empfehlung: Regular Expressions | ICU Documentation zu Gemüte führen.

1 Like

@erAck Danke, die marker \Q … \E kannte ich noch nicht. Das ist dann wohl das ICU-equivalent zu pythons re.escape( … )
offtopic: die verlinkte Seite hat echt einen Designpreis verdient, links >25% nichts, rechts 25% nichts, und in der Mitte eine schmale Tabelle mit horizontalen Scrollbalken … entweder kann man die MetaZeichen sehen , oder die vollständige Beschreibung dazu! Beides gleichzeitig … NÖ :thinking:

1 Like

Von der Funktionsweise her ja. Python re.escape() escaped (hoffentlich) alles was eine Meta-Bedeutung hat oder Operator ist und returned den escaped string, der dann re.compile() übergeben werden kann. \Q...\E sagt “alles dazwischen ist literal”.

sofern kein backslash enthalten ist, sonst: SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 14-15: truncated \xXX escape
Und warum benutzt re.escape() immer 2 backslashes zum Maskieren?

weil der backslash schon in python selbst eine escape-sequence einleitet, aus diesem Grund muss man in regulären Ausdrücken entweder den backslash escapen: \\ ; oder die RegEx als RawString mit einem prefix r einleiten: r' … '
also entweder rawstring oder backslashes verdoppeln.
re.escape setzt doppelte backslashes vor meta-zeichen als um diese als literale zu maskieren.

In diesem Leben werde ich das wohl nicht mehr verstehen, aber dies ist ja kein Python-Forum.

re.search('\.', '123.456')
<re.Match object; span=(3, 4), match='.'>

Die geniale Lösung ist in der Trennung in 2 Spalten, die eine Spalte mit dem „Vorwärts“-Vergleich und die zweite mit dem „Rückwärts“-Vergleich, wie von @Villeroy vorgeschlagen!
Mit =REGAUS() komme ich überhaupt nicht weiter, weil die 2 Eingabe-Spalten beliebig bis gegen unendlich stetig um Zeilen erweitert werden, womit die zu vergleichenden Ausdrücke gleich 2fach zu ergänzen sind.


@karolus : die Markierung \Q … \E kannte auch ich noch nicht!
Muss ich um Mitternacht noch testen! :face_with_monocle::woozy_face::yawning_face:

@erAck : die Funktion =REGAUS() ist vortrefflich, jedoch nicht universell, viele Ausdrücke funktionieren in CALC nicht. Mit meiner Vorliebe benutzt, sind “[:alpha:]”, “[:alnum:]” etc. für jeden echten Buchstaben, Buchstabe+Ziffer, wie auch das große „ß“. Ob ein solch komplexer Ausdruck auch Ligaturen erkennt (fi, ffi = je 1 Buchstabe) , habe ich noch nicht getestet. Ich lerne nie aus & bin stets neugierig …

Welche nicht? Es sollte alles funktionieren, was ICU regex definiert.