Regulärer Ausdruck - Text muss 10 mal das Wort OK beinhalten

Neue Frage »

Auf diesen Beitrag antworten »
Dani Regulärer Ausdruck - Text muss 10 mal das Wort OK beinhalten

Meine Frage:
Ein Programm gibt bei einer bestimmten Aktion einen Code aus. In diesem Code muss 10 mal das Word OK stehen, damit die Aktion abgeschlossen werden darf. Gibt es einen Regulären Ausdruck (Regular Expression), die einen Text durchsucht und überprüft, ob genau 10 mal das Wort OK im Text steht? Die OKs sind nicht direkt aneinander gereiht und vor und nach einem OK kann jedes beliebige Zeichen stehen. Ich würde mich freuen, wenn ihr mir weiterhelfen könntet.

Meine Ideen:
(OK)/g
gibt 10 Matches wieder.
Stehen aber nur 9 OKs im Text, gibt es 9 Matches wieder.
Ich benötige aber einen Regulären Ausdruck, der für den Text nur ein OK gibt, wenn 10 mal OK im Text vorkommt.
 
Auf diesen Beitrag antworten »
eulerscheZahl

Versuche mal das hier:
code:
1:
^([^O]|O[^K])*(OK([^O]|O[^K])*){10}$
Auf diesen Beitrag antworten »
Dani

Das schaut schon mal sehr gut aus! Vielen Dank.

Jetzt habe ich festgestellt, dass im Text noch weitere Begriffe sind, die OK beinhalten. Die OKs, die es abprüfen soll, haben davor und danach Anführungszeichen, also "OK"

Kann man das auch noch mit in die Regular Expression einbauchen, dass er nur die OKs mit Anführungszeichen abprüft?

Es soll also bei 10 mal "OK" eine positive Meldung / 1 Match geben.

Vielen Dank im Voraus

Grüße
Auf diesen Beitrag antworten »
eulerscheZahl

Du kannst nicht plötzlich die Spielregeln ändern Forum Kloppe
Hast du meinen Regex verstanden?
([^O]|O[^K])* ist alles außer OK, also entweder etwas außer O oder ein O, den kein K folgt.
Das kannst du erweitern. Kann gut sein, dass es noch eine bessere Lösung gibt, aber ich weiß nicht wie.
 
Auf diesen Beitrag antworten »
Dani

Sorry ;-) Aber manchmal sieht man das erst, wenn man es ausprobiert.

Hab die Reg Ex mal abgeändert:

^([^"]|"[^O])*("OK"([^"]|"[^O])*){10}$

Scheint zu funktionieren, die Anzahl passt und die Reg Ex wirft nur 1 Match, wenn die Anzahl 10 in den geschweiften Klammern steht.

Allerdings schaut die nicht ganz so toll aus. Evtl. gibt es da noch eine andere Lösung, die tatsächlich den kompletten Ausdruck "OK" prüft?

Momentan gibt es nämlich jeweils 1 Match mit folgenden Varianten:

^([^"]|"[^O])*("O([^"]|"[^O])*){10}$
^([^"]|"[^O])*("OK([^"]|"[^O])*){10}$
^([^"]|"[^O])*("OK"([^"]|"[^O])*){10}$
Auf diesen Beitrag antworten »
Dani

So einigermaßen habe ich deine Reg Ex verstanden:

([^O]|O[^K]) --> alles außer OK
* --> und das mit beliebig viel Text
(OK --> bis zum ersten OK
([^O]|O[^K])*){10} --> und dieses OK 10 Mal mit beliebig viel Text ohne OK hinter dem jeweiligen OK

Sprich wenn hinter dem letzten OK nicht beliebig viel Text kommen würde, oder sofort wieder ein OK, dann würde der Code nicht funktionieren?

Was bezweckt denn das ^ ganz zu Beginn und das $ zum Schluss für diesen Code?

Vielen vielen Dank für deine Hilfe!!!
Auf diesen Beitrag antworten »
eulerscheZahl

Zitat:
Sprich wenn hinter dem letzten OK nicht beliebig viel Text kommen würde, oder sofort wieder ein OK, dann würde der Code nicht funktionieren?

Doch. * heißt ja beliebig viele. Also auch 0. Stünde da ein +, dann hättest du Recht.

Mir gefällt mein Regex auch nicht, eben weil er für längere Wörter ziemlich unhandlich wird.
Ich hatte es noch mit negative lookbehind probiert, aber nicht hinbekommen.

^ heißt, dass das der Anfang der Zeile ist. $ ist das Ende. Sonst hätte ein Ausdruck mit 11 OK ja einen Teilausdruck mit 10 OK.
Auf diesen Beitrag antworten »
Dani

Diese hier funktioniert auch, aber es zeigt auch ein Match, wenn mit der RegEx nach weniger als 10 OKs gesucht wird.

(.*?\"OK\"){10}

sprich im Text steht 10x "OK"

folgende RegEx haben ein Match:

(.*?\"OK\")
(.*?\"OK\"){0}
(.*?\"OK\"){1}
(.*?\"OK\"){2}
(.*?\"OK\"){3}
(.*?\"OK\"){...}
(.*?\"OK\"){8}
(.*?\"OK\"){9}
(.*?\"OK\"){10}
--> höher --> kein Match

^([^"]|"[^O])*("OK"([^"]|"[^O])*){10}$ liefert wirklich nur ein Match, wenn auch 10x "OK" im Text steht
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
^([^"]|"[^O])*("OK"([^"]|"[^O])*){10}$

wenn der Text ein "O enhält, das kein "OK" ist, dann findet der Regex es auch nicht.
Wenn schon, dann
code:
1:
^([^"]|"[^O]|"O[^K]|"OK[^"])*("OK"([^"]|"[^O]|"O[^K]|"OK[^"])*){10}$

Wobei mir da auch ein Problem aufgefallen ist: Wenn nach "O direkt "OK" kommt, also "O"OK", wird nicht korrekt gezählt.
Auf diesen Beitrag antworten »
Dani

Die Konstellation "O"OK" sollte so nicht vorkommen. Von daher schaut das nach der Top Lösung aus :-)

Herzlichen Dank!!!

Gott
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »