Avatar billede megabyte_ Nybegynder
22. maj 2008 - 09:16 Der er 8 kommentarer og
4 løsninger

Find ip i en string

Hej

Jeg sider og roder med et lille problem
Jeg skal have taget en stak ip adresser ud af en string
Det vil sige jeg har en hel liste med tekst og nogen af de linjer indeholder ip'er
Hvad jeg mangler er en funktion der kan returnere alle ip adresser fra en string

fx
string:
qwer [1.1.1.1] qwertyu 2.2.2.2 qwerr3.3.3.3wqeqwe 4.4.4.590

funktionen skal så retunere
1.1.1.1
2.2.2.2
3.3.3.3

Het sværger så er der ingen tegn man kan locate som start og stop
Jeg håber der er nogen der kan hjælpe

Mvh

/MB
Avatar billede hrc Mester
22. maj 2008 - 10:48 #1
Altså noget med at søge en streng igennem for 4 tal adskilt af 3 punktummer...
Avatar billede pidgeot Nybegynder
22. maj 2008 - 11:16 #2
Du bør nok bruge et regulært udtryk (regex) til formålet. Hvis du bruger Delphi.NET er der noget i System.Text.RegularExpressions i.NET, ellers skal du ud og finde et komponent (der er nogle stykker derude).

Den regex du skal bruge er:
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
Avatar billede megabyte_ Nybegynder
22. maj 2008 - 11:48 #3
Jeg bruger delphi 7 personal

Jeg har ledt lidt efter et regex komponent men jeg har ikke kunne finde nogen der virker som de skal :/
Avatar billede megabyte_ Nybegynder
22. maj 2008 - 12:02 #4
Jeg har fundet det her http://regexpstudio.com/TRegExpr/TRegExpr.html men det tager kun den første ip med :/
Avatar billede pidgeot Nybegynder
22. maj 2008 - 12:29 #5
Du husker at kalde ExecNext i en løkke efter du har fået det første resultat, ikke?

if Exec(InputString) then
  repeat
    //behandl resultat
  until not ExecNext;
Avatar billede hrc Mester
23. maj 2008 - 12:14 #6
Jeg bryggede det her sammen. Det fylder måske lidt mere end et hardcore regex men du kan kigge på det.

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  ParseStringForIPs(fTest,lbResult.Items);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  fTest := '2.1.2.3qwer [1.1.1.1] qwe4rtyu 2.2.2.2 qwe2rr3.3.3.3wqeqwe 4.4.4.293fds';
end;

procedure TfrmMain.ParseStringForIPs(aString: string; aResult: TStrings);
var
  i,j: integer;
  OK: boolean;
  Value: integer;
  IP: TStringList;
  InSegment: boolean;
begin
  // Extract dots'n integers
  InSegment := false;
  for i := length(aString) downto 1 do
  begin
    if aString[i] in ['.','0'..'9'] then
      InSegment := true
    else begin
      System.Delete(aString,i,1);
      InSegment := false;
    end;

    if not InSegment and (length(aString) >= i) then
    begin
      aResult.Add(copy(aString,i,MaxInt));
      System.Delete(aString,i,length(aString) - i + 1);
    end;
  end;
  if InSegment then
    aResult.Add(aString);

  // Do we have four integers?
  IP := TStringList.Create;
  try
    IP.Delimiter := '.';
    for i := aResult.Count - 1 downto 0 do
    begin
      IP.DelimitedText := aResult[i];
      OK := IP.Count = 4;
      if OK then
      begin // Numbers in valid range?
        OK := true; j := IP.Count;
        while (j > 0) and OK do
        begin
          dec(j);
          Value := StrToInt(IP[j]);
          OK := (Value >= $00) and (Value <= $ff);
        end;
      end;
      if not OK then
        aResult.Delete(i);
    end;
  finally
    IP.Free;
  end;
end;
Avatar billede mbsnet Nybegynder
23. maj 2008 - 12:44 #7
Her er et andet eksempel:

type
tripleChar = string[3];
sChar      = string[1];
ipAddress  = string[15];

const
NOTHING = '';
DOT    = '.';
VBCRLF  = #13+#10;

function isBetween(const i,a,b:longInt):boolean;overload;
begin result:=(i>=a) and (i<=b) end;

function isBetween(const i,a,b:char):boolean;overload;
begin result:=(i>=a) and (i<=b) end;

function isNumericChar(const ch:char):boolean;
begin result:=isBetween(ch,'0','9') end;

function isNumeric(const s:ansiString):boolean;
var i:smallInt;
begin result:=s<>NOTHING;
if result then for i:=1 to length(s) do
  if not isNumericChar(s[i]) then begin result:=false;exit end
end;

function matchIpChar(const ch:char):boolean;
begin result:=ansiPos(ch,'0123456789.')>0 end;

function validIpPart(const p:tripleChar):boolean;
begin result:=isNumeric(p) and isBetween(strToInt(p),0,255) end;

function replaceChar(const s:ansiString;const ch:sChar;const value:ansiString):ansiString;
var i:longInt;
begin result:=NOTHING;
for i:=1 to length(s) do
  if s[i]=ch then result:=result+value else result:=result+s[i]
end;

function validIpAddress(const ip:ipAddress):boolean;
var sl:tStringList;
begin result:=false;if length(ip)<7 then exit;
sl:=tStringList.create;sl.text:=replaceChar(ip,DOT,vbcrlf);
if sl.count=4 then result:=validIpPart(sl[0]) and validIpPart(sl[1])
                        and validIpPart(sl[2]) and validIpPart(sl[3]);
sl.free
end;

function extractIpList(const s:ansiString;var rslt:ansiString):boolean;
var ip:ipAddress;i,stPos,sLen:longInt;ch:char;
begin i:=0;stPos:=0;sLen:=length(s);result:=false;rslt:=NOTHING;
while i<sLen do begin inc(i);ch:=s[i];
  if (stPos=0) and matchIpChar(ch) then stPos:=i else //find char som kan være ip
  if (stPos>0) and (not matchIpChar(ch)) then begin  //kontroller når andet tegn
  ip:=copy(s,stPos,i-stPos);
  if validIpAddress(ip) then begin
    rslt:=rslt+ip+vbcrlf;result:=true
  end;stPos:=0
  end
end
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:ansiString;
begin
if not extractIpList(memo1.lines.text,s) then s:='NO IP ADDRESSES';
memo2.lines.text:=s;
end;
Avatar billede megabyte_ Nybegynder
29. maj 2008 - 13:06 #8
Hej

sry jeg har været så langsom til ta svare tilbage, har ikke haft tid prg arbejde :)
Efter som at jeg brugte pidgeot løsning med regxp bør ahn få points men hrc og mbsnet svar virker også så hvis i alle vil lægge et svar deler jeg dem mellem jer

/MB
Avatar billede pidgeot Nybegynder
29. maj 2008 - 13:22 #9
Svar :)
Avatar billede hrc Mester
29. maj 2008 - 13:37 #10
Pidgeots løsning er også nørdet.
Avatar billede mbsnet Nybegynder
29. maj 2008 - 14:33 #11
zZzZz :)
Avatar billede mbsnet Nybegynder
29. maj 2008 - 14:34 #12
zZzZz :)
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