2016-04-13 3 views
0

Ich versuche, eine Regex zu machen, die mit einer Zahl übereinstimmt, deren Summe, es ist Parität, ist gerade. Also ist 802 (8 + 0 + 2) gerade, und 902 (9 + 0 + 2) ist ungerade. Offenbar gibt es ein arithmetisches Gesetz, um diese Regex zu tun, ohne zu zählen oder irgendwelche Regex-Regeln zu brechen. Ich habe eine Regex für gerade Zahlen gemacht, aber nicht für gerade Parität.Regex gerade Parität

Edit: Es ist erlaubt führende Nullen zu übernehmen, und die Anzahl beliebiger Länge (offensichtlich kleiner ist als die maximale Größe ein int in den meisten Sprachen sein kann) sein kann

Dank!

+0

Wie viele Ziffern sollte es enthalten? –

+0

Denke nicht, dass das möglich ist. Ich glaube, dass die Arithmetik, auf die Sie in Ihrer Frage Bezug genommen haben, mit der Validierung eines arithmetischen Ausdrucks zu tun hat. Backreferenzing ist eine naheliegende Sache, die in den Sinn kommt, aber das ist für Dinge wie Klammervergleich, etc. ... – nurchi

+0

Wenn es nur zwei Ziffern ist, dann ist es einfach ['[02468] {2} | [13579] {2}'] (https://regex101.com/r/yO9mA4/1). Für mehr Ziffern wird es kompliziert. –

Antwort

0

Dies ist eine wirklich schwierige (ich bin neu in Regex), aber ich habe gerade gelernt, dass Sie Rekursion in einigen Aromen von Regex verwenden können.

Das ist, was ich kam mit:

String regex = "(([02468]*[13579]){2}(?R))|[02468]*$"; 

Die Idee ist, eine kluge Vereinfachung zu verwenden, wo eine Parität Nummer, auch wenn die Anzahl der ungeraden Ziffern nur noch, weil die Summe aus einer geraden Anzahl von ungeraden Ziffern ist immer gerade, und die Summe einer beliebigen Anzahl von geraden Ziffern ist immer gerade. Erläuterung:

([02468]*[13579]){2} → 2 odd digits separated by any number of even digits 
(?R)     → Repeat the whole regex on the string after match 
|     → OR 
[02468]*$   → the rest of String is 0 or more even digits 

EDIT
Rekursion macht nur die Schreibweise einfacher, aber es ist immer noch möglich, ohne Rekursion (in einigen Sprachen wie Java nicht Rekursion implementiert haben), die Idee ist gleich:

String regex = "(([02468]*[13579]){2})*[02468]*$" 
+0

dieser Teil: "[02468] + $" muss optional sein: "[02468] * $". Versuchen Sie mit dieser Zeichenfolge: "11" – Robert

+0

@Robert oops, ich hatte es von * auf + geändert, aber Sie haben Recht, es muss optional sein, danke – Maljam