[PERL] Reguliere expressie IP Matchen *

Pagina: 1
Acties:

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Ik heb een expressie probleem omtrent ip herkenning op een regel.

Ik heb de volgende input (is een verkorte versie) gebruikt om te testen:
10.0.0.1
0.0.0.0
10.0.0.0
0.0.0.1
1.2.3.4.5.6.7
1.2.3.4.5.6.7 10.0.0.1 1.2.3.4.5.6.7
3.4.52.1.3.2 10.0.0.1 4.3.2.31.3

Nu kan het dus zijn dat 1.2.3.4.5.6.7 anders is (7.6.5.4.3.2.1) of gemixed, dit zijn dus geen statische nummers, dit geld voor elke regel.

Nu match hij regel 1, 5, 6 en 7.
Regel 5 is geen ip, zou hij niet mogen matchen.
Regel 6 en 7 matched hij op de eerste 4 cijfers omdat dat ook een bestaand ip kan zijn.

Mijn expressie:
/((25[0-5]|2[0-4][0-9]|1?[0-9]{0,2})\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]{0,2})\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]{0,2})\.(25[0-4]|2[0-4][0-9]|1?[0-9]{0,2}))/

Dit herkent alles van 1.x.x.1 tot 255.255.255.254 als ik het goed hebt getikt.

Ik wil dus dat hij enkel x.x.x.x matched en niet x.x.x.x.x.x.x, maar dus ook niet de x.x.x.x van de x.x.x.x.x.x.x.

Heeft iemand hier een oplossing voor? Ik ben zelf niet super met expressies, maar ben niet de enige die geen directe oplossing ziet.

Alvast bedenkt :D

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Dit is wel een beetje makkelijk te Googlen:
http://www.google.nl/sear...atch+ip+addresses&spell=1

Deze site:
http://www.regular-expres...egexbuddy/ipaccurate.html
is overigens erg informatief betreffende regex'en.

Wie trösten wir uns, die Mörder aller Mörder?


  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Confusion schreef op dinsdag 20 maart 2007 @ 15:32:
Dit is wel een beetje makkelijk te Googlen:
http://www.google.nl/sear...atch+ip+addresses&spell=1

Deze site:
http://www.regular-expres...egexbuddy/ipaccurate.html
is overigens erg informatief betreffende regex'en.
Ja, was het maar zo simpel. Je hebt niet goed gelezen wat het probleem is.

Want de gegeven expressie op http://www.regular-expres...egexbuddy/ipaccurate.html matched 255.255.255.255, maar ook 1.1.1.1.1.1.1.1.1.1.1 waarbij het 1.1.1.1 als match zal zien.
En daar gaat het om, dat mag hij dus niet.

Een ip matchen is niet zo moeilijk nee. Daarbij is de gegeven link niet eens een correct ip aangezien 0.0.0.0 ook gematched zou worden wat geen ip is.
\b(?: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Tevens is er tot aan pagina 62 op google geen pagina die mijn probleem op lost.

Zou graag willen dat je de volgende keer iets beter leest voor je denkt een simpel antwoord te kunnen geven. :)

  • kh65
  • Registratie: Juni 2006
  • Laatst online: 01-12 21:35
Ik denk dat onderstaande expressie doet wat jij wilt:

/^\s*((25[0-5]|2[0-4][0-9]|[1?[0-9][0-9]|0?[1-9][0-9]|0?0?[1-9])\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\.(25[0-4]|2[0-4][0-9]|1?[0-9][0-9]|0?[1-9][0-9]|0{0,2}[1-9]))\s*$/

Ik heb jouw regexp als uitgangspunt genomen.
Niet echt lang gekeken of het slimmer kan.

Als het niet echt in één expressie hoeft dan kan je natuurlijk ook zeggen
if (/^\s*(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$/) {
if ($1 > 0 and $1 <= 255 and $2 >= 0 and $2 <= 255 and $3 >= 0 and $3 <= 255 and $4 > 0 and $ 4<= 254) {
# Found one !!!
}

}

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Wat is precies je doel? Want op deze maniet match je een hele zooi geldige adressen niet. Bijvoorbeeld adressen die op een 0 eindigen, wat prima mag.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

PeeCee schreef op dinsdag 20 maart 2007 @ 16:38:
Want de gegeven expressie op http://www.regular-expres...egexbuddy/ipaccurate.html matched 255.255.255.255, maar ook 1.1.1.1.1.1.1.1.1.1.1 waarbij het 1.1.1.1 als match zal zien.
En daar gaat het om, dat mag hij dus niet.
Welnee, het ding matched ook word boundaries.

Wie trösten wir uns, die Mörder aller Mörder?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Topictitlefix:
[PERL] Regiliere expressie probleem >> [PERL] Reguliere expressie IP Matchen *

Probeer voortaan zelf een beetje een 'dekkende' titel te verzinnen a.u.b.? "probleem" is zo breed ;) Daarnaast heb ik een klein spelvautje gefix0red ;)

[ Voor 49% gewijzigd door RobIII op 20-03-2007 19:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Het korte antwoord: gebruik geen regular expressions hiervoor.
Het lange antwoord:klik

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
kh65 schreef op dinsdag 20 maart 2007 @ 16:59:
Ik denk dat onderstaande expressie doet wat jij wilt:

/^\s*((25[0-5]|2[0-4][0-9]|[1?[0-9][0-9]|0?[1-9][0-9]|0?0?[1-9])\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\.(25[0-4]|2[0-4][0-9]|1?[0-9][0-9]|0?[1-9][0-9]|0{0,2}[1-9]))\s*$/

Ik heb jouw regexp als uitgangspunt genomen.
Niet echt lang gekeken of het slimmer kan.

Als het niet echt in één expressie hoeft dan kan je natuurlijk ook zeggen
if (/^\s*(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$/) {
if ($1 > 0 and $1 <= 255 and $2 >= 0 and $2 <= 255 and $3 >= 0 and $3 <= 255 and $4 > 0 and $ 4<= 254) {
# Found one !!!
}

}
Deze regex gaat er vanuit dat er spaties opheen staan. en daar zit juist er probleem er mag van alles omheen staan maar geen punt (.).

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
RobIII schreef op dinsdag 20 maart 2007 @ 19:09:
Topictitlefix:
[PERL] Regiliere expressie probleem >> [PERL] Reguliere expressie IP Matchen *

Probeer voortaan zelf een beetje een 'dekkende' titel te verzinnen a.u.b.? "probleem" is zo breed ;) Daarnaast heb ik een klein spelvautje gefix0red ;)
Sorry :$ Had een beetje haast (einde werktijd) :7

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
CyBeR schreef op dinsdag 20 maart 2007 @ 17:05:
Wat is precies je doel? Want op deze maniet match je een hele zooi geldige adressen niet. Bijvoorbeeld adressen die op een 0 eindigen, wat prima mag.
Het doet is dus een IP te vinden in de regel, maar er van geen punt voor of achter staan want dat zijn andere nummers die ik niet wil hebben.

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
MUBA schreef op woensdag 21 maart 2007 @ 01:48:
Het korte antwoord: gebruik geen regular expressions hiervoor.
Het lange antwoord:klik
Juist. Het gaat hier om regel voor regel lezen uit een file. Ik heb geen mogelijkheid tot socket info.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
PeeCee schreef op woensdag 21 maart 2007 @ 12:05:
Als het niet echt in één expressie hoeft dan kan je natuurlijk ook zeggen
if (/^\s*(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$/) {
if ($1 > 0 and $1 <= 255 and $2 >= 0 and $2 <= 255 and $3 >= 0 and $3 <= 255 and $4 > 0 and $ 4<= 254) {
# Found one !!!
}

[...]

Deze regex gaat er vanuit dat er spaties opheen staan. en daar zit juist er probleem er mag van alles omheen staan maar geen punt (.).
vervang dan \s door [^\.]*

edit:
het lijkt me trouwens ook dat er geen getal voor of achter mag staan... dus vervang \s door:
[^0-9\.]*
(dat is dus: [dakje-nul-tot-negen-backslash-punt])

[ Voor 13% gewijzigd door P.O. Box op 21-03-2007 12:21 ]


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 17-11 14:00
Ik denk dat je ongeveer zoekt wat kh65 zei maar dan met word boundary's ipv begin en einde van de string.
^ en $ moet je dan vervangen voor \b

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

PeeCee schreef op woensdag 21 maart 2007 @ 12:08:
[...]
Het doet is dus een IP te vinden in de regel, maar er van geen punt voor of achter staan want dat zijn andere nummers die ik niet wil hebben.
Wat is er mis met de regex waar ik naar linkte? (Behalve dat deze ook 0.0.0.0 matched, maar dat is in de meeste gevallen geen probleem en sowieso makkelijk op te lossen)

Wie trösten wir uns, die Mörder aller Mörder?


  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Confusion schreef op woensdag 21 maart 2007 @ 12:57:
[...]

Wat is er mis met de regex waar ik naar linkte? (Behalve dat deze ook 0.0.0.0 matched, maar dat is in de meeste gevallen geen probleem en sowieso makkelijk op te lossen)
Nou, die matched ook een string zoals '1.1.1.1.1.1.1.23.3.2.1.2.2.1.' die in de zelfde regel staan. En dat is een probleem, want dat mag niet.

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
PiepPiep schreef op woensdag 21 maart 2007 @ 12:42:
Ik denk dat je ongeveer zoekt wat kh65 zei maar dan met word boundary's ipv begin en einde van de string.
^ en $ moet je dan vervangen voor \b
Al gehad, doet hij ook niet goed.

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Edwardvb schreef op woensdag 21 maart 2007 @ 12:17:
[...]

vervang dan \s door [^\.]*

edit:
het lijkt me trouwens ook dat er geen getal voor of achter mag staan... dus vervang \s door:
[^0-9\.]*
(dat is dus: [dakje-nul-tot-negen-backslash-punt])
Ja, maar nu ben ik van de string die ik uit de regel trek het eerste teken en laatste teken kwijt.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
oei.. .dat heeft iets met gready en non-gready te maken.... ehrm... ff denken... :)


edit:

ook als je [^0-9\.]* gebruikt??? (kan natuurlijk ook: [^\d\.]* )
(kun je een voorbeeld van een string geven van wat je hebt, wat je verwacht en wat je krijgt?

[ Voor 51% gewijzigd door P.O. Box op 21-03-2007 14:06 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

PeeCee schreef op woensdag 21 maart 2007 @ 13:46:
Nou, die matched ook een string zoals '1.1.1.1.1.1.1.23.3.2.1.2.2.1.' die in de zelfde regel staan. En dat is een probleem, want dat mag niet.
Confusion in "[PERL] Reguliere expressie IP Matchen *"

Wie trösten wir uns, die Mörder aller Mörder?


  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Edwardvb schreef op woensdag 21 maart 2007 @ 14:03:
oei.. .dat heeft iets met gready en non-gready te maken.... ehrm... ff denken... :)


edit:

ook als je [^0-9\.]* gebruikt??? (kan natuurlijk ook: [^\d\.]* )
(kun je een voorbeeld van een string geven van wat je hebt, wat je verwacht en wat je krijgt?
Ik ga eerst even jou idee proberen.. nog geen tijd voor gehad.

En nee, sorry, heb geen 'regel' zoals waar wij het uit moeten halen. Denk niet dat KPN blij is als ik delen van hun log files op staart gooi :+

Kan wel een voorbeeld geven :):
2007/Mar/19 1.2.3.4.1.22.44.32.1 =commando blaat blaat 127.0.0.1 =result stuff

Zoals je ziet kom ik soms eerst het nummer tegen die ik niet wil hebben, maar er zijn ook regels waarbij de nummers omgekeerd zijn en hij eerst het ip tegen komt in de regel.

Ik kan het jammer genoeg nergens checken of het ip echt bestaat van wat ik moet controlleren, want ja, 1.2.3.4 is ook een ip nummer.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

edit:
Ik had het in Python uitgeprobeerd (die in ieder geval voor deze regex Perl compatible zou moeten zijn), maar ik heb duidelijk iets niet goed gedaan, want ik heb het net weer geprobeerd en je hebt gelijk: hij matched wel 1.2.3.4.5.6.7.8.

Het zou handig zijn als ik kon achterhalen wat ik dan dinsdag deed, want dat lostte je probleem op (of ik was gewoon stom).

[ Voor 81% gewijzigd door Confusion op 23-03-2007 14:58 ]

Wie trösten wir uns, die Mörder aller Mörder?


  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Confusion schreef op vrijdag 23 maart 2007 @ 11:33:
De regex waar ik naar linkte matched 1.2.3.4 niet als de zin 1.2.3.4.1.22.44.32.1 bevat. Probeer hem eens uit. Het ding matched precies drie keer "een geldig IP deel gevolgd door een punt", gevolgd door "nog een geldig IP deel". De gehele match moet omgeven zijn door word boundaries.

Lees die link en de uitleg en probeer hem uit, dan snap je waarom dat ding precies doet wat je wilt. Anders zou je nooit delen van zinnen kunnen matchen waarin gelijksoortige delen die je niet wilt matchen ook voorkomen.
Jawel, hij vind nogsteeds 1.2.3.4 van 1.2.3.4.5.6.7.8.9. Heb je hem wel eens geprobeerd in perl?

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
WAAROM wil je perse een regex gebruiken hiervoor?
het is makkelijk om bepaalde zaken af te vangen met wat code regels en dan de rest te checken met een expressie lijkt me.

zo kan je de sterke punten van beide mogelijkheden gebruiken, toch?

Klus page: http://klusthuis.blogspot.com


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

PeeCee schreef op vrijdag 23 maart 2007 @ 11:57:
Jawel, hij vind nogsteeds 1.2.3.4 van 1.2.3.4.5.6.7.8.9. Heb je hem wel eens geprobeerd in perl?
Sorry, je hebt gelijk.

Ik heb het inmiddels (met wat hulp) teruggevonden wat ik had gedaan (weer in Python getest, maar zou Perl compatible moeten zijn):
code:
1
\s((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\s

Het probleem is dat \b ook punten en komma's enzo matched, omdat dat word boundaries zijn. Met een \s zou je alleen dingen moeten matchen met een whitespace ervoor en erna en met de extra haakjes voorkom je dat je die gematchde whitespaces erbij grouped. Werkt dit voor je?

Wie trösten wir uns, die Mörder aller Mörder?


  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
Confusion schreef op vrijdag 23 maart 2007 @ 16:52:
[...]

Sorry, je hebt gelijk.

Ik heb het inmiddels (met wat hulp) teruggevonden wat ik had gedaan (weer in Python getest, maar zou Perl compatible moeten zijn):
code:
1
\s((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\s

Het probleem is dat \b ook punten en komma's enzo matched, omdat dat word boundaries zijn. Met een \s zou je alleen dingen moeten matchen met een whitespace ervoor en erna en met de extra haakjes voorkom je dat je die gematchde whitespaces erbij grouped. Werkt dit voor je?
Bedankt, maar jammer genoeg niet.

Ik heb echter wel al voor elkaar gekregen dat hij van 1.2.3.4.5.6.7.8.9.0 niets matched dat eindigd met een punt. Nadeel daarvan is dat hij dan 7.8.9.0 uit de string haalt :S
En de zelfde toepassing op het begin werkt niet.

Trouwens, heb geen code daarvan op het moment, daarbij heb ik ook nog niet kunnen testen of hij nog wel werkt als er spaties,letters naast staan.

  • PeeCee
  • Registratie: September 2005
  • Laatst online: 21-11 16:37
liquid_ice schreef op vrijdag 23 maart 2007 @ 15:33:
WAAROM wil je perse een regex gebruiken hiervoor?
het is makkelijk om bepaalde zaken af te vangen met wat code regels en dan de rest te checken met een expressie lijkt me.

zo kan je de sterke punten van beide mogelijkheden gebruiken, toch?
Heb jij een andere oplossing voor me die net zo snel is dan? Graag.

Houd er rekening mee dat het hier om soms meer dan 100 log bestanden kan gaan van ieder +/- 300MB met meer dan 2,5 miljoen regels.
Pagina: 1