webForumDet fria alternativet

Reguljärt uttryck strular lite

Programmering

10 svar · 682 visningar · startad av xcalibrate

Medlem sedan aug. 2002136 inlägg
Frågan#1

Hej!

Jag får in dessa typ av data:

conn 192.168.0.1 pass hej
conn 192.168.0.1:27015 password hej
connect 192.168.0.1 hej
192.168.0.1:27015 hej

Det är alltså olika connection strings.
Det jag vill få ut är ip-numret (192.168.0.1), och när satt port-numret (27015) och lösenordet "hej".

För att ta ut ip-numret har jag:
\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

Mina kunskaper är begränsade här så jag skulle gärna vilja ha lite hjälp :) Det bästa vore om jag fick tre separerade uttryck (en för ip, en för port och en för lösenordet).

Tack på förhand!

Medlem sedan juni 20019 519 inlägg
#2

Skall raden börja med ett IP nummer? Och är det alltid den porten eller kan det variera? Och kan lösenordet innehålla mellanslag?
Vilket språk skall det vara till? php, .net, ruby?

Medlem sedan aug. 2002136 inlägg
#3

Skall raden börja med ett IP nummer?:
Inte nödvändigtvis, det kan börja med "conn 192.168.1.33"

Och är det alltid den porten eller kan det variera?
Det kan vara olika portnummer, men det är alltid ett nummer! "[0-9+]"?

Och kan lösenordet innehålla mellanslag?
Nej

Vilket språk skall det vara till?
C++ i detta fall

Medlem sedan juni 20019 519 inlägg
#4
\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]?)):(\d+) ([^\s]+)$

träffar endast "192.168.0.1:27015 hej" på texten:

conn 192.168.0.1 pass hej
conn 192.168.0.1:27015 password hej
connect 192.168.0.1 hej
conn [b]192.168.0.1:27015 hej[/b]

och:

conn 192.168.0.1 pass hej
conn 192.168.0.1:27015 password hej
connect 192.168.0.1 hej
[b]192.168.0.1:27015 hej[/b]

\d = 0-9 vet ej om c++ klarar det men.
Grupper $1 = IP $2 = port $3 = lösenordet.
(med Multiline i regExp options).

Medlem sedan aug. 2002136 inlägg
#5

Tack,

Sträng att testa mot: conn 192.168.1.33:27015 pass hej
RexExp:
\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]?)):(\d+)

Ger mig:
- 192.168.1.33
- 27015

Om jag lägger till " ([^\s]+)$" på slutet matchar det inte. Verkar vara något fel där.
Sen funkar det inte om jag t.ex. tar bort ":27015" då matchar det inte heller. Många av de connection strings jag får in innehåller inte porten.

* Jag testade i http://www.utvecklarna.se/verktyg/regular_expression_validator.php

Tack!

Medlem sedan juni 20019 519 inlägg
#6

Vilka av dina exemplen skall matchas? uttrycket säger just nu att port nummer måste finnas:

\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]?)):?(\d+)? ([a-z\d]+)
Medlem sedan aug. 2002136 inlägg
#7

Alla exempel måste kunna matchas, helst i en regexp men måste man dela upp på flera är det ok.

Jag testade din senaste regexp du skickade men får resultatet:
- 192.168.1.33
- 27015
- pass <- pass istället för hej

på "conn 192.168.1.33:27015 pass hej"

Port måste INTE finnas.

Tack för din hjälp!

Medlem sedan juni 20019 519 inlägg
#8
\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]?)):?(\d+)?(?: (?:password|pass))? ([a-z\d]+)

Om det nu alltid är password eller pass som kan finnas.

Medlem sedan aug. 2002136 inlägg
#9

Tack!

Medlem sedan aug. 2002136 inlägg
#10

Jag insåg nu att om jag skriver något av:

192.168.1.33
conn 192.168.1.33
conn 192.168.1.33:27015

Det bästa vore om det gick att göra så att man bara ska kunna ange ip-numret så får man ip-numret och "undefined" på port och password. Samma om man skriver både ip-numret och port-numret då ska man få "undefined" på bara passwordet. Är detta möjligt?

Medlem sedan juni 20019 519 inlägg
#11

Du får väl se om du får något i match[1] i ditt uttryck för port = om den finns eller längden är 0 => undefined.

281 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
155 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)