Regex Pattern erstellen in dem die Zahlen nur von 0 - 255 gehen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Dieser reguläre Ausdruck prüft auf eine Zahl zwischen 0-255.

\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b

Zusammengebaut für vier aufeinanderfolgende Zahlen, getrennt durch einen Punkt, sollte dieser Ausdruck passen:

^(\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b)\.(\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b)\.(\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b)\.(\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b)$
Pheonix1234 
Fragesteller
 14.12.2019, 22:38
Es funktioniert nicht mit 000.12.12.034
0
regex9  14.12.2019, 22:53
@Pheonix1234

Das stimmt, für diese neue Anforderung wäre der Ausdruck noch nicht richtig.

Du müsstest diesen Fall zum Grundmuster (mein oberster Snippet) hinzufügen: 0[0-9]{2}.

1
Pheonix1234 
Fragesteller
 14.12.2019, 22:54
@regex9

Okay, vielen Dank (: Das hat mir sehr weiter geholfen.

0
Pheonix1234 
Fragesteller
 14.12.2019, 23:26
@regex9

Oh cool, das kannte ich vorher noch nicht. Vielen Dank (:

0
regex9  14.12.2019, 22:56

Ich frage mich gerade, wieso ich bei dem unteren Ausdruck keine Quantifiers angewandt habe. 😐

2
Pheonix1234 
Fragesteller
 14.12.2019, 22:57
@regex9

Stimmt, naja es hat trotzdem seinen Sinn und Zweck erfüllt (:

0

Vergiss das mit der RegEx und parse die Zahl:

try {
  int n = Integer.parse(input);
  if (n >= 0 && n <= 255) {
     // handle valid range
  } else {
     // handle invalid range
  }
} catch (NumberFormatException e) {
  // handle exception
}

Kann jeder lesen, verstehen und erweitern. Klartext, nicht Kryptografie...

Einige kleine Anmerkungen, nicht nur für den Fragensteller, sondern für alle mitlesenden Softwareentwickler:

  1. In deinem String musst du "\d" mit Doppelslash (also "\\d") escapen, es sei denn, du nutzt rohe Strings.
  2. RegEx wird überbewertet. In deinem Falle ist ein parsen von vier Integern schneller, sauberer und zuverlässiger.
  3. IP-Adressen sollte man als ahnungsloser Entwickler NIE selbst überprüfen, sondern diese Aufgabe den APIs überlassen, die Wissen was sie tun und entspr. Fehler abfangen. (Das gleiche gilt auch für Mailadressen!)
  4. Eine gültige Form für Localhost ist "127.1", obwohl du vermutlich nur "127.0.0.1" kennen wirst.
  5. Die IP "12.34.5678" ist gültig. (Beachte, das letzte Element, welches größer als 255 ist!)
  6. Auch die IPs "1" oder "1234567890" sind gültige IPv4 Adressen. Und diese Formate sind nicht mal exostisch, sondern durchaus üblich!

Merke: Textuelle Repräsentationen von gewissen Daten sollte man nur prüfen, wenn man auch die RFC oder die Spezifikation dazu gelesen hat.

Funfact: Ich habe schon mehrere tausend Zeichen lange RegEx-Orgien zur Verifikation von E-Mails gesehen, aber noch keine davon hat valide Formate erkannt, die ich mir aus den Fingern gesaugt habe.

Es ist zwar rein theoretisch möglich, alles mögliche mit Regexen zu validieren, aber in der Praxis artet das selbst bei scheinbar (!) trivialen Problemen extrem aus, wenn man es "richtig" machen will.

Du solltest dich damit zufrieden geben, solche Formate nur ganz grob zu testen, und den Rest der API zu überlassen, die letztendlich damit arbeiten muss, und deren eventuelle Fehler abfangen.

Beispiel: Eine Mailadresse sollte als eine solche akzeptiert werden, wenn ein '@' drin vorkommt. Mehr nicht. Das wars. (Genau genommen ist selbst das schon zu viel, aber ich will das jetzt nicht übertreiben.)

Und eine IP sollte dann als gültig akzeptiert werden, wenn eine Ziffer drin vorkommt.

In beiden Fällen (Mailaddr. und IP) wäre jede weitere Prüfung darüber hinaus, eine Einschränkung und somit ganz eindeutig ein Bug, der valide Eingaben fälschlicherweise als ungültig ablenen würde.

So, das wars. :)

Woher ich das weiß:Berufserfahrung

Auf der Seite https://www.oreilly.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html ist ein Beispiel für IPv4-Adressen.

Da geht es auch um Zahlen von 0...255.

Das Pattern dort ist: 25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?

Pheonix1234 
Fragesteller
 14.12.2019, 20:09

Sorry aber diese Antwort hat mir garnicht weitergeholfen. Das Pattern hat meinen Code noch unfunktionabler gemacht als vorher

0
gogogo  14.12.2019, 20:37
@Pheonix1234

Erst mal möchte ich anmerken, dass ich auch Probleme mit deiner Frage habe. Vielleicht habe ich deshalb nicht auf das geantwortet, was du meintest.

"Die ersten ein bis drei Zahlen ..."? Wirklich Zahlen oder nur Ziffern?

Meine Antwort sind 3 Gruppen:

- 25x

- 2xy mit x <=4

- 1xy und 0xy

0
Pheonix1234 
Fragesteller
 14.12.2019, 20:57
@gogogo

Es ist einfach nur Fakt, dass deine Antwort nicht geholfen hat.

Um dir, meine Frage noch einmal verständlicher zu machen:

Ich möchte in Java ein String Pattern definieren, mit dem Muster A.B.C.D, wobei A, B, C, D Zahlen vom Wert 0 bis 255 sein können und wobei die Länge von A,B,C,D nicht größer als drei sein darf.

Wenn ich meinen Code mit deinem vorgeschlagenem Pattern ausführe schlagen bei mir 3/3 Test Fälle falsch. Mit meinem Pattern waren es nur 2/3 Test Cases, woraus also folgt, dass deine Antwort mir nicht weitergeholfen hat und meine Ergebnisse verschlechtert hat.

2