2016-07-11 18 views
3

Ich versuche, eine Regex für die Validierung einer IP-Adresse zu schreiben.Wie wiederhole ich eine einfangende Gruppe?

Während dies funktioniert:

String reg = "((0|1)?\\d{1,2}|2[0-4]\\d|25[0-5])"; 
public String pattern = reg + "." + reg + "." + reg + "." + reg; 

Dies scheint nicht zu arbeiten, und ich verstehe nicht, was falsch ist.

String pattern = "((0|1)?\\d{1,2}|2[0-4]\\d|25[0-5]\\.){3}((0|1)?\\d{1,2}|2[0-4]\\d|25[0-5])"; 

Bitte erläutern, was ich vermisse.

+0

bedenken Sie, dass "." bedeutet "pass auf alles" , wenn Sie das "." In einer IP-Adresse würden Sie "\." – dustinroepsch

+0

@ WiktorStribiżew: Der erste funktioniert. Zweite nicht. Ich möchte die wiederholte Version davon schreiben. Ist mit {3} etwas nicht in Ordnung? – Hooli

+0

@ DustinRyan-Roepsch Danke! – Hooli

Antwort

4

Sie sind nicht richtig Gruppierung: der Punkt \\. ist Teil der 25[0-5] Produktion, so wäre es nicht in der Mitte des dreiteiligen Gruppe abgestimmt werden, wenn die Adresse ausschließlich aus 25x Komponenten besteht.

Ihre erste Regex ist frei von diesem Problem, da Punkte außerhalb der Gruppierungsklammern hinzugefügt werden. Allerdings sind die Punkte nicht entgangen, was bedeutet, dass der Ausdruck würde zusammen mit den richtigen sind einige falsche Strings entsprechen (zB 123a210b132c210)

Klammern um Ihre einstelligen Produktionen Hinzufügen behebt dieses Problem:

(((0|1)?\d{1,2}|2[0-4]\d|25[0-5])\.){3}((0|1)?\d{1,2}|2[0-4]\d|25[0-5]) 
//^       ^

Demo.

+1

Wow !! Hat funktioniert. Vielen Dank! und ich habe es auch verstanden! – Hooli

Verwandte Themen