22. maj 2008 - 09:16Der 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
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
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;
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;
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
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.