RegEx Zahlenprüfung

Hallo!

Ich versuche folgendes Problem mit RegEx zu lösen:
Man stelle sich vor, Ihr habt fünfstellige Zahlen, die bestimmte Ziffern aus einer Liste enthalten sollen.
Es gibt zwei Fälle, die ich prüfen muss:
1. Die Zahlen in der Liste müssen genau 1x vorkommen und keine anderen Zahlen sind erlaubt!
2. Die Zahlen in der Liste müssen genau 1x vorkommen und es dürfen zusätzlich auch andere vorkommen!

Beispiel:
Code:
Liste mit Zahlen: 0, 2, 4, 6, 8
Zahl: 02468
Ergebnis: Wahr

Zahl: 86420
Ergebnis: Wahr

Zahl: 81146
Ergebnis: Falsch

Zahl: 12345
Ergebnis: Falsch

Ich bin noch nicht so fit in Regex und meine bisherigen Versuche haben immer nur einen Teil erfüllt, deshalb frag ich nun Euch!

Gruß
Felix
 
Hallo, ich habe mich auch nur mal indas Thema rein gelesen, aber ich will mal versuchen, hier einen Anfang zu machen:
2. Die Zahlen in der Liste müssen genau 1x vorkommen und es dürfen zusätzlich auch andere vorkommen!
Wie kann denn das erfüllt sein? Wenn man nur eine fünfstellige Zahl hat, wie sollen dann noch andere Ziffern vorkommen können? Oder gilt für den zweiten Fall, dass auch mehr als fünf Ziffern zulässig sind?
 
Geht auch anders. Hier, hab das mal schnell in Python geschrieben, ohne Regex.

Code:
#!/usr/bin/env python

def regex(numberList, template=[]):
	succ = True
	for i in numberList:
		if len(template) < 1:
			if numberList.count(i) > 1:
				succ = False
				break
		else:
			if numberList.count(i) > 1:
				succ = False
				break
			if template.count(i) == 0:
				succ = False
				break

	return succ

print regex([0,1,2])
print regex([99,123213,99])
print regex([1,2,3], [1,2,3])
print regex([1,2,3], [2,3])


Ausgabe:
Code:
True
False
True
False

EDIT: Man kann natürlich auch einfach einen String übergeben ;)
Code:
print regex("12213223495") # --> false
 
Original von Ook!
1. Die Zahlen in der Liste müssen genau 1x vorkommen und keine anderen Zahlen sind erlaubt!
2. Die Zahlen in der Liste müssen genau 1x vorkommen und es dürfen zusätzlich auch andere vorkommen!
Das wirst du mit regulären Ausdrücken nicht abbilden können. Eine Prüfung wie "jedes Zeichen darf nur einmal in der Zeichenkette vorkommen" sind damit unmöglich.
 
Da es sich um fünfstellige Zahlen handelt und du eine Liste mit 5 Zahlen hast, können nur Zahlen, bei denen jede einzelne Ziffer eine andere Zahl von den 5en ist wahr ergeben, wenn deine Bedingungen oben die Aufgaben sind. Also kannst du nur in weniger als 5^5 (also < 3125) Fällen die Bedingung erfüllen, da man ja manche "Zahlenbereiche" dabei nicht einrechnen kann (z.B. 20248 - doppelte 2 etc.). Die 2. Bedingung ist also nicht sinnvoll, sollte es Teil der Aufgabe sein, dass bloß fünfstellige Zahlen überprüft werden sollen.

Ich würd das dann machen in dem die Zahl von einer Routine nach der ersten Zahl die in der Liste der erlaubten Ziffern steht durchsucht wird und wenn sie dort drin ist, wird gesucht, ob sie ein 2. Mal auftaucht, wenn ja --> return false. Das gleiche für die 2. Zahl in deiner Liste und jede weitere. Sollte etwas unklar sein, frage nach, werde das ganze morgen abend mal in Delphi umsetzen.
 
*in alten Daten auf der organischen Festplatte kram*
Man kann mit RegEx nicht so ohne weiteres zählen. Zumindest nicht elgegant. In Perl gibt es mittlerweile eine Erweiterung
http://perldoc.perl.org/perlre.html (Backtracking)
aber i.R wird man entweder RegEx mit der sonst verwendeten Programmiersprache mischen müssen oder "komplizierte" RegEx Terme verwenden und praktisch alle Fälle aufzählen, was bei der Anzahl

Code:
 findall(Sol,shuffle([0,2,4,6,8],Sol),Sols),length(Sols,Anzahlloesungen).
Sols = [[0, 2, 4, 6, 8], [0, 2, 4, 8, 6], [0, 2, 6, 4, 8], [0, 2, 6, 8, 4], [0, 2, 8, 4|...], [0, 2, 8|...], [0, 4|...], [0|...], [...|...]|...],
Anzahlloesungen = 120.
was nicht wirklich tragbar wäre ;)

Code:
fall1([],[]).
fall1(Erlaubt,[Num|Rest]):-select(Num,Erlaubt,ErlaubtNeu),fall1(ErlaubtNeu,Rest),!.

fall2(_,[],[]).
fall2(Erlaubt,Verbraucht,[Num|Rest]):- select(Num,Verbraucht,ErlaubtNeu),fall2(Erlaubt,ErlaubtNeu,Rest),!
                              ; %oder
                              \+member(Num,Erlaubt),fall2(Erlaubt,Verbraucht,Rest).
fall2(Erlaubt,Zahlen):- fall2(Erlaubt,Erlaubt, Zahlen).
Ausgabe:
Code:
76 ?- fall1("02468","82406").
true.

77 ?- fall1("02468","824060").
fail.

78 ?- fall2("02468","82406").
true.

79 ?- fall2("02468","824061").
true.

80 ?- fall2("02468","824060").
fail.
 
Danke für die Antworten! :)
Mir ging es nur darum, ob es möglich ist, solche Prüfungen in RegEx abzubilden.

Zur zweiten Prüfung... stimmt.
Ich hatte vor fünf- bis siebenstellige Zahlen zu prüfen, habs dann aber aus irgendwelchen Gründen verworfen und nicht mehr dran gedacht, dass ich dann ja die zweite Prüfung rausnehmen muss ;)
 
Es ist möglich... Es gibt dafür verschiedene Varianten. Da wäre auch noch die Frage in welcher Sprache du es haben möchtest.
Eine Möglichkeit in PHP zum Beispiel sind lookaheads:
^([0-9])(?!\1)([0-9])(?!\1|\2)([0-9]) ... $
usw. du kannst den rest selbst vervollständigen.
Die obere Variante gilt bereits einmal für die Liste 0-9 mit drei Ziffern, was du natürlich ändern kannst.
Noch leichter wäre es mit lookbehinds oder lookarounds.
 
Zurück
Oben