Avatar billede riversen Nybegynder
26. august 2003 - 12:27 Der er 21 kommentarer og
1 løsning

regularexpression igen igen

Jeg har simpelthen dårlig til det her, men det kommer nok jo flere eksempler jeg får set.

jeg vil tjekke om en streng lever op til reglerne for en ip adresse
Avatar billede nmh Nybegynder
26. august 2003 - 12:31 #1
regler: blot 4 tal mellem 0 og 255 (254?) adskilt af punktum?
Avatar billede riversen Nybegynder
26. august 2003 - 12:33 #2
ja, jeg ved ikke om fx 0.1.0.0 er gyldig men ellers er det vel fra 1.0.0.0

ved egentlig ikke om det går til 254 eller 255 i sidste oktet.
Avatar billede riversen Nybegynder
26. august 2003 - 12:34 #3
du behøver ikke tage højde for multicast adresser og localhost hvis det er for bøvlet
Avatar billede martin.jensen Nybegynder
26. august 2003 - 12:39 #4
Hvis du laver det i JAVA vil jeg nok anvende en lidt anden fremgangsmåde end en "ren" regexp. Da de tilladte værdier for 2 og 3 ciffer jo er afhængige af det 1 ciffer kan det godt blive lidt langhåret i regexp. Hvis du tager det tegn for tegn og checker det med et par if sætning bliver det med stor sandsynlighed også hurtigere end en regexp.
Avatar billede nmh Nybegynder
26. august 2003 - 12:40 #5
Kan du bruge et simpelt script, der blot undersøger om der er tale om 4 tekststrenge adskilt af punktum, og hver streng består af fra 1 til 3 cifre, således at tallet er mindre end 255?
Sådan et kan jeg godt lave. Jeg har bare ikke tid lige nu.
eller skal det være noget med reg. exp.?
Avatar billede riversen Nybegynder
26. august 2003 - 12:43 #6
det kan jeg også godt selv, men det bliver meget simplere kode med reg.exp...
Avatar billede arne_v Ekspert
26. august 2003 - 12:43 #7
En start kunne ihvertfald være:

    private static Pattern p = Pattern.compile("[0-9]+.[0-9]+.[0-9]+.[0-9]+");
    public static boolean isValidIp(String s) {
        return p.matcher(s).matches();
    }
Avatar billede erikjacobsen Ekspert
26. august 2003 - 12:49 #8
private static Pattern p = Pattern.compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+");
Avatar billede arne_v Ekspert
26. august 2003 - 12:51 #9
Eller:

    public static boolean isValidIp2(String s) {
        try {
            String[] parts = s.split("[.]");
            int v1 = Integer.parseInt(parts[0]);
            int v2 = Integer.parseInt(parts[1]);
            int v3 = Integer.parseInt(parts[2]);
            int v4 = Integer.parseInt(parts[3]);
            return (v1 >= 0 && v1 <= 255 &&
                    v2 >= 0 && v2 <= 255 &&
                    v3 >= 0 && v3 <= 255 &&
                    v4 >= 0 && v4 <= 255);
        } catch(Exception e) {
            return false;
        }
    }
Avatar billede arne_v Ekspert
26. august 2003 - 12:52 #10
Erik>

Ja.

Eller:

    private static Pattern p = Pattern.compile("[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+");
Avatar billede riversen Nybegynder
26. august 2003 - 14:45 #11
0-9 holder da ikke
Avatar billede arne_v Ekspert
26. august 2003 - 14:49 #12
isValidIp tester kun om det er tal.tal.tal.tal - isValidIp2 tester mere grundigt
(men stadigvæk ikke helt ifølge IP numre semantik).
Avatar billede riversen Nybegynder
26. august 2003 - 14:52 #13
ja, kan sagtens selv finde ud af isvalidip2...derfor jeg spørger til regular expression...så kunne jeg også lære lidt ved du nok :-)
Avatar billede arne_v Ekspert
26. august 2003 - 14:55 #14
Jeg tror ikke at regular expression er egnede til at teste på 0-255.

Men et eller flere tal er de gode til.
Avatar billede riversen Nybegynder
26. august 2003 - 14:56 #15
ok...hvis nogen vil have point svarer man...ellers lukker jeg :-)
Avatar billede erikjacobsen Ekspert
26. august 2003 - 14:58 #16
Ork jo, du skal bare nævne dem allesammen:

  "(0|1|...|9|00|01|...|99|000|001|..|255|)\\. osv osv"

Desværre skal du skrive alle muligheder. Man kan forkorte lidt af det, men
det bliver så kompliceret at der sikkert kommer fejl i.

Så, nej, det vil ikke være nemt at lave li'som Arnes isValidIp2
Avatar billede arne_v Ekspert
26. august 2003 - 14:58 #17
svar
Avatar billede arne_v Ekspert
26. august 2003 - 14:59 #18
erik>

:-)
Avatar billede elv Nybegynder
26. august 2003 - 15:00 #19
Det kan godt lade sig gøre, men det er bare ikke pænt... "ikke egnet" er et godt udtryk. Det er noget manuelt stads i stil med:
(^[0-9]{1,2}$)|(^[0-1][0-9]{1,2}$)|(^2[0-4][0-9]$)|(^25[0-5]$)
bare for at teste om en string er 0-255. - ikke-testet :)
Avatar billede erikjacobsen Ekspert
26. august 2003 - 15:06 #20
Regulære udtryk er "egnede" til at genkende strukturer dannet af tegn.
De egner sig ikke til at "tælle", eller til "semantik".

De kan derfor godt genkende et antal cifre, strukturen, men bør ikke misbruges
til at finde ud af hvad tallene betyder. Det kan man så gøre efterfølgende
med almindelig kode.

Arne, din isValidIp2: Hvad gør den med "676767676767676767676767676767676767.1.1.1" ?
Avatar billede arne_v Ekspert
26. august 2003 - 15:09 #21
Jeg har ikke prøvet men den returnerer vel false.
Den må vel dø på en parse.
Avatar billede arne_v Ekspert
26. august 2003 - 15:10 #22
Jep.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester