Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einfache Regex gesucht (https://www.delphipraxis.net/184402-einfache-regex-gesucht.html)

idefix2 23. Mär 2015 17:19

Einfache Regex gesucht
 
Hallo,
ich frage mich gerade, ob es eine einfache Möglicheit gibt, folgenden Check direkt auf der Regexebene durchzuführen, mir fällt dazu aber nichts Gescheites ein:
Ein gültiger Ausdruck besteht aus einem oder mehreren von 4 bestimmten Buchstaben in beliebiger Reihenfolge, das wäre also als Regex z.B. [KJFR]+
aber mit der Einschränkung, dass jeder der 4 Buchstaben höchstens einmal vorkommen darf.

Namenloser 23. Mär 2015 17:37

AW: Einfache Regex gesucht
 
Geht, so wie ich das sehe, nur, wenn du alle Permutationen explizit auflistest. Also 'KJFR|KJRF|KRJF|KRFJ|...'
Nicht wirklich sinnvoll :wink:

Uwe Raabe 23. Mär 2015 17:42

AW: Einfache Regex gesucht
 
Warum soll es denn unbedingt RegEx sein?

swkevin08 23. Mär 2015 17:48

AW: Einfache Regex gesucht
 
Machs wie du es auf dem Papier lösen würdest! Bau dir einen endlichen Automaten! ;)

idefix2 23. Mär 2015 17:52

AW: Einfache Regex gesucht
 
Es muss nicht unbedingt Regex sein. Aber ich verwende Regex, um diesen Teilstring aus einem grösseren String herauszuklauben, und wenn der Check dabei gleich mitgegangen wäre (es geht sicher irgendwie, aber auf eine einfache Lösung bin ich nicht gekommen), wäre es am einfachsten gewesen. Natürlich kann ich die Prüfung auch extra programmieren.

himitsu 23. Mär 2015 17:53

AW: Einfache Regex gesucht
 
Code:
^[KJFR]{4}$
genau 4
Code:
^[KJFR]{1,4}$
1 bis 4

BUG 23. Mär 2015 18:09

AW: Einfache Regex gesucht
 
Zitat:

Zitat von Namenloser (Beitrag 1294551)
Geht, so wie ich das sehe, nur, wenn du alle Permutationen explizit auflistest. Also 'KJFR|KJRF|KRJF|KRFJ|...'

Für echte reguläre Ausdrücke hast du vermutlich recht, mit Perl-Style-Regex geht es dank Look-ahead und Back-references :shock:
Code:
([abc])(?!\1)([abc])(?!\1|\2)([abc])(?!\1|\2|\3)
Hier kann man testen.

JasonDX 23. Mär 2015 18:11

AW: Einfache Regex gesucht
 
Es ist absolut möglich. Die Sprache, die du beschreiben willst, ist regulär, also ist sie sogar mit der theoretischen Definition von Regulären Ausdrücken beschreibbar.
Abgesehen von der Auflistung aller Worte (Wie von Namenloser beschrieben) ginge evt. das:
Code:
(K?J|J?K)?(FR|RF)? | (K?F|F?K)?(JR|RJ)? | (K?R|R?K)(FJ|JF)? | (F?J|J?F)(KR|RK)? | (J?R|R?J)?(KF|FK)? | (F?R|R?F)?(KJ|JK)?
ist aber weniger leserlich.
Ansonsten, wenn wir von PCREs reden, bin ich sicher dass es eine kompaktere Möglichkeit gibt [edit]siehe Beitrag darüber[/edit].
Allerdings ist das dann wahrscheinlich kaum noch performant. Insb. weil wir von einer endlichen Sprache reden, sind Regexes overkill.
Die Prüfung direkt im Code zu erledigen ist definitiv performanter und leserlicher.


Zitat:

Zitat von himitsu (Beitrag 1294557)
Code:
^[KJFR]{4}$
genau 4
Code:
^[KJFR]{1,4}$
1 bis 4

Erfüllt zwar nicht
Zitat:

Zitat von idefix2 (Beitrag 1294548)
aber mit der Einschränkung, dass jeder der 4 Buchstaben höchstens einmal vorkommen darf.

Aber könnte als Vor-Filter für die Auswertung im Code verwendet werden.

idefix2 23. Mär 2015 19:04

AW: Einfache Regex gesucht
 
Danke für eure Antworten. Mit dem Ansatz von Bug werde ich wohl weiterkommen (ist noch nicht ganz das, was ich brauche, weil der String darf jeden Buchstaben höchstens einmal enthalten, muss aber nicht alle 4 erlaubten Buchstaben enthalten - aber das zu verändern dürfte jetzt eher einfach sein, ein paar zusätzliche Klammern und Fragezeichen und es sollte passen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz