![]() |
bis zu einem bestimmten zeichen suchen?
hallo delphipraxis :hi:
wie kann ich in einem string der beispielsweise '1 2 3 4 5' es hinbekommen dass ich bei 1 anfange bis zu einem bestimmten zeichen, zum beispiel 3, zu suchen? mit AnsiPos hab ich es nicht hinbekommen |
Re: bis zu einem bestimmten zeichen suchen?
Delphi-Quellcode:
for a := 1 to Length (String) do
if (String[a] = DeinZeichen) then Gefunden; |
Re: bis zu einem bestimmten zeichen suchen?
am einfachsten geht es mit pos (wobei ansipos ebenso einfach funktionieren sollte). Wenn du es nicht hinnbekommst sage einfach wie du es versucht hast und wir sagen dir was daran falsch ist :)
|
Re: bis zu einem bestimmten zeichen suchen?
So wie ich es verstanden habe, will er "ab ..." suchen, bzw. hat das vor. Bei Pos / AnsiPos müsste er den String danach trimmen, damit die Funktionen nicht wieder vom Anfang an starten.
|
Re: bis zu einem bestimmten zeichen suchen?
ok. danke.
ist das selbe auch möglich mit zb. wenn ich einen string mit 'ABCDEF' habe von A bis D zu suchen? |
Re: bis zu einem bestimmten zeichen suchen?
ja, es geht mit beliebigen zeichen.
|
Re: bis zu einem bestimmten zeichen suchen?
"for a := 'A' to Length(String) do"
das mit dem length(string) stört mich etwas.. denn in meinem programm weis man ja nicht, wielang dieser string ist odr sein kann. |
Re: bis zu einem bestimmten zeichen suchen?
stop - versuche den Quelltext zu verstehen. Die schleife muss immer von 1 los laufen. Schließlich willst du ab dem ersten zeischen sucben und nicht ab dem Aaaten.
|
Re: bis zu einem bestimmten zeichen suchen?
for a := 1 to 4 do
ok.. aber das kann ich ja schlecht nehmen denn man weis ja nicht wielang der string nun ist.. da ist noch ein problem. der sucht dann aber, wenn irgentwo im text A steht, nicht ab dem A sondern ab der aller ersten position im memo. |
Re: bis zu einem bestimmten zeichen suchen?
genau. Mit der Funktion Length kannst du aber die länge des Strings ermitteln.
Wenn dein String also von 1 bis Length(DeinString) geht und dein String 5 zeischen lang ist geht die Schleife von 1 bis 5. Schaue dir am besten mal auf ![]() [Edit] Wenn du ab dem A und nicht ab dem ersten A suchen willst musst du trotzdem das erste A finden damit du weißt ab wo du suchen musst [/Edit] |
Re: bis zu einem bestimmten zeichen suchen?
genau das ist ja das problem
- die länge des strings ist unbekannt. also ich meine, es gibt eigentlich keinen string er soll ja in einem memo suchen. |
Re: bis zu einem bestimmten zeichen suchen?
Memo1.lines.Text ist ein String.
Delphi-Quellcode:
aber wie bereits erwähnt würde ich dir die Grundlagen nahe legen. Ohne die wirst du nicht weit kommen.
var
deinstring: String; begin deinstring := memo1.lines.text; |
Re: bis zu einem bestimmten zeichen suchen?
ich glaube ihr versteh mich nicht :(
angenommen das folgende ist mein text IM memo von oben nach unten: A B C DE F GH I J So.. er sollte dann bei DE anfangen zu suchen bis er auf GH stößt, alles dazwischen ist nicht wichtig |
Re: bis zu einem bestimmten zeichen suchen?
Du redest die ganze Zeit von String und meinst TStrings.
[edit] Was willst Du denn "suchen"? [/edit] |
Re: bis zu einem bestimmten zeichen suchen?
Zitat:
A B C DE F GH I J Dann möchte ich bei "DE" anfangen zu suchen. Wenn er dann bis auf GH stößt, soll er aufhören. Also da drum gehts eigentlich, das Suchen von einer bestimmten stelle im text bis zu einer bestimmten stelle. anmerkung: ich habe keinen string, ich habe demnach auch keine exakte länge eines strings. nur inhalt im memo der immer unterschiedlich ist. |
Re: bis zu einem bestimmten zeichen suchen?
Ich meinte, was möchtest Du als Ergebnis? Den Index des gefundenen Eintrags?
|
Re: bis zu einem bestimmten zeichen suchen?
aso letztendlich geht es nur um die letzten zwei bis drei buchstaben bzw. zeichen.
|
Re: bis zu einem bestimmten zeichen suchen?
Sry, vielleicht bin ich ein bisschen begriffsstutzig. Zeig doch mal ein Beispiel mit Deinem Memo und was Du genau haben möchtest.
|
Re: bis zu einem bestimmten zeichen suchen?
ok. sagen wir mal das da unten ist ein memo
und unten ein button: ---------------------------------------------- A B C DE F GH I J ---------------------------------------------- -------- *Suchen -------- sogar mit rahmen damit man es erkennt. klickt man auf *suchen sollte er das memo erstmal durchsuchen bis er "DE" gefunden hat. hat er "DE" gefunden, soll er von da aus weiter suchen, aber nur bis er auf "GH" trifft. |
Re: bis zu einem bestimmten zeichen suchen?
Und als Ergebnis soll F herauskommen?
|
Re: bis zu einem bestimmten zeichen suchen?
erm... ergebnis sollte "GH" sein.
ich bin grad dran da eine funktion zu schreiben. aber mein problem ist es ab "DE" zu suchen. ab dem ersten zeichen im memo zu suchen geht ja, aber aber "DE" und dann von "DE" bis "GH" kriege ich nicht hin :oops: |
Re: bis zu einem bestimmten zeichen suchen?
Ich verstehe zwar nicht wofür es gut ist.... aber das passiert mir ja öfters.
Du möchtest also wissen ob:
Also einfach .IndexOf("DE") und IndexOf("GH) ermitteln. Wenn der erste <>-1 und kleiner als der zweite ist hast Du es. |
Re: bis zu einem bestimmten zeichen suchen?
Obwohl ich die Aufgabenstellung immer noch nicht ganz verstanden habe:
Delphi-Quellcode:
Kann man zwar alles mit IndexOf machen, aber Du musst ja wissen, was Du willst.
var start, ende, i: integer;
begin start := Memo.Lines.IndexOf('DE'); ende := -1; if (start > -1) then begin i := start; while (i < Memo.Lines.Count - 1) and (ende < 0) do begin inc(i); if Memo.Lines[i] = 'GH' then ende := i; end; end; end; |
Re: bis zu einem bestimmten zeichen suchen?
ich habe mir das mal angeguckt.
dieser code gibt die zeilennummer aus in der zb. F gefunden wurde. "A B C DE F // 5 GH I J" Das mit dem IndexOf habe ich zwar verstanden aber funktionniert quasi genau so wie das oben. naja also das klappt alles nicht so richtig :( eigentlich sollte "GH" ausgegeben werden |
Re: bis zu einem bestimmten zeichen suchen?
Edit:
habe nochmal ü+berlegt das ist rausgekommen:
Delphi-Quellcode:
So.. das ist die grundidee, denke ich.
procedure TForm1.Button1Click(Sender: TObject);
var i, x, StartPos, Ende: Integer; Text: String; begin Text := Memo1.Lines.Text; for i := 1 to Length(Text) do begin if (Text[i] = 'D') then begin StartPos := i; Caption := '1. Schleife: '+IntToStr(i); for x := StartPos to Length(Text) do if (Text[x] = 'F') then begin Caption := '2. Schleife: '+Copy(Text, x, 1); end; end; end; Nur was nicht funktioniert ist zb. (Text[x] = 'GH') .. |
Re: bis zu einem bestimmten zeichen suchen?
Hallo,
du bemühst dich zwar dein Problem programmtechnisch zu beschreiben, aber bevor du das sauber hinkriegst, musst du noch viel lernen. Deshalb ist es besser, wenn du dein Problem nicht als Programmierer, sondern als Anwender zu beschreiben versuchst. Es ist für den benötigten Programmcode ein gewaltiger Unterschied, ob du in einem oder mehreren Strings suchst. Die ganzen Feinheiten, die dein Problem vollständig beschreiben würden, kannst du mit deinem Wissensstand nicht sehen. Wenn du dich dann noch bemühst, die eigentliche Problemspäre zu verschleiern, dann wird dein Thread auf eine unangenehme Weise sehr spannend. Was steht in dem Memo? Welche Bedeutung hat der Inhalt? Was hast du vor? Freundliche Grüße vom marabu |
Re: bis zu einem bestimmten zeichen suchen?
mit dem, dass ich das als anwender nicht ls programmierer erklären soll verstehe ich nicht.. egal.
verschleiern? was verschleiere ich denn? ok ich rede klartext: ich habe einen text.. einen html text den ich von einer url aus hole. diesen code möchte ich überprüfen lassen und beispielsweise alle image-tags, zum beispiel der hier: <img alt="text" title="text"> in solche umwandeln: <img alt="text" title="text" /> dafür müsste ich erstmal "<img" suchen. von da aus ginge es vortan drum bis zum nächsten ">" weiterzusuchen. das ">" würde dann durch " />" ersetzt. für mich zum "visualisieren" habe ich folgendes zurecht geschnitten:
Delphi-Quellcode:
damit sehe ich z.b.: "aha.. d fängt da und da an und f fängt da und da an.
for i := 1 to Length(Text) do
begin if (Text[i] = 'd') then begin StartPos := i; TestMemo.Lines.Add('1. Schleife: "'+IntToStr(i)+'"'); for x := StartPos to Length(Text) do if (Text[x+1] = 'f') then begin TestMemo.Lines.Add('1. Schleife: "'+Copy(Text, x, 2)+'"'); end; end; end; // die TestMemos sind dafür da um alle inhalt festhalten zu können d und f wären demnach <img und > |
Re: bis zu einem bestimmten zeichen suchen?
ich würde so vorgehen:
Erst mal mit Pos('<img') die Position des img-Tags ermitteln, von da ab nach ">" suchen und an der Position von ">" einfach Insert(Zeile,Position,'/') machen. |
Re: bis zu einem bestimmten zeichen suchen?
Moin, Moin,
habe mir nicht alles bis zum letzten Punkt durchgelesen, aber warum machst du das nicht mit TRichEdit, da gibt es eine Methode FindText, die ist eigentlich ganz simpel anzuwenden ... Gruß Ralph |
Re: bis zu einem bestimmten zeichen suchen?
Delphi-Quellcode:
Ungetestet, aber so müsste es klappen, vorausgesetzt, der img-Tag ist auch komplett in einer Zeile.
procedure TForm1.Button1Click(Sender: TObject);
var i, p: Integer; z: String; begin for i:= 0 to Memo1.Lines-1 do begin z:=Memo1.Lines[i]; //Zeile aus Memo holen p:=Pos('<img',z); inc(p,4); //'<img' übergehen while z[p] <> '>' do inc(p); //p bleibt auf Position von '>' stehen Insert(' /',z,p); Memo1.Lines[i]:=z; //Zeile wieder zurück ins Memo end; end; |
Re: bis zu einem bestimmten zeichen suchen?
Zitat:
zu folgendem ergebnis bin ich gekommen:
Delphi-Quellcode:
var
i, x, StartPos, Ende: Integer; Text: String; begin Text := Memo1.Lines.Text; for i := 1 to Length(Text) do begin if (Text[i] = '<') then begin StartPos := i; TestMemo.Lines.Add('1. Schleife: "'+Copy(Text, i, 4)+'"'); // <img gefunden? if Copy(Text, i, 4) = '<img' then begin for x := StartPos to Length(Text) do if (Text[x] = '>') then begin TestMemo.Lines.Add('2. Schleife: "'+Copy(Text, x, 1)+'"'); end; end; end; end; end; wer es testen will braucht: 2 memos. tipps im memo1 folgendes ein: [img][/img] bei klick auf den button kommen 2 sachen ins TestMemo. einmal <img und das zweite ist > damit habe ich DAS schonmal geschafft.. von (schmetaisch) C bis E zu suchen.. |
Re: bis zu einem bestimmten zeichen suchen?
Zitat:
Delphi-Quellcode:
function foo(sl:TStringList;AStart,AStop:String):tStringList; //result is NIL if nothing found
var sTmp : string; i,j,k : integer; begin result:=TStringList.Create; //optimistic version i:=0; while i<sl.count do begin sTmp:=sl[i]; //analyze a line k:=pos(AStart,sTmp); //is there anything we are looking for? if k>0 then begin //start found j:=i; //keep this for next search i:=sl.count; //more elegant than exit result.add(copy(sTmp,k,length(sTmp)); //include this into the result end; inc(i); //next line end; //of while construct if result.count>0 then //did we find a start begin i:=j; while i<sl.count do begin sTmp:=sl[i]; k:=pos(AStop,sTmp); if k>0 then begin i:=sl.count; //exit this while construct result.add(copy(sTmp,1,k+length(AStop)-1); // end else result.add(sTmp); inc(i); end;//while end//AStart found else//otherwise we do not deliver any result FreeAndNil(result); end; Wenn Du nur ein Ergebnis haben willst, falls das Ende auch gefunden wurde muesstest Du noch zwei Zeilen einfuegen. Hab das ganze jetzt nur mal schnell so hingetippert, weil ich auf diesem Rechner kein Delphi habe. Es geht sicherlich eleganter/effizienter, aber das sollte auch einigermassen erlaeutern, was zu tun ist. |
Re: bis zu einem bestimmten zeichen suchen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Progman,
was machst du, wenn im HTML-Dokument ein solches Element auftaucht?
Code:
Nachdenkliche Grüße
[img]assets/media.gif[/img]
PS: Auch FindText() löst das Problem nicht viel besser als Pos() |
Re: bis zu einem bestimmten zeichen suchen?
dann nehm ich eben AnsiLowerCase und geb die Zeile dann als AnsiLowerCase(z) zurück, denn Tags sollen in Kleinschreibung sein ;)
Natürlich muss man in der Endversion noch Prüfungen einbauen, ob nicht /> schon korrekt da steht. Mein Beispiel sollte ja nur die etwaige Vorgehensweise zeigen. Hier korrigierter Source:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, p: Integer; z: String; begin for i:= 0 to Memo1.Lines-1 do begin z:=LowerCase(Memo1.Lines[i]); //gleich in Kleinbuchstaben umwandeln :-) p:=Pos('<img',z); if p > 0 then begin inc(p,4); //'<img' übergehen while z[p] <> '>' do inc(p); //p bleibt auf Position von '>' stehen if z[p-1] <> '/' then Insert(' /',z,p); Memo1.Lines[i]:=z; end; end; end; |
Re: bis zu einem bestimmten zeichen suchen?
-
Editiert |
Re: bis zu einem bestimmten zeichen suchen?
Ich habe da immernoch ein kleines Problem..
Undzwar folgendes: Wenn der Cursor an der mit X markierten Stelle ist, funktioniert alles super.. ist der cursor aber irgentwo nach der mit Y markierten stelle gibts probleme.
Code:
mein schlechter code:
<body"X">"Y"
// text text und mehr text </body> (<body wird gefunden, kein problem. der rest .. naja)
Delphi-Quellcode:
eigentlich dachte ich sollte es so gehen:
for x := CurPosition-4 downto 0 do
begin StartTag := Copy(SynMemo1.Text, x, 5); if StartTag = '<body' then begin iEndTag := PosEx('>', SynMemo1.Text, CurPosition); if iEndTag <> 0 then begin GetCaretPos(Point); bodyPopUp.Popup(Point.X+125, Point.Y+50); exit; end; end; end; Ab der cursorposition soll "<body " gesucht werden (rückwärts). ist es gefunden, gehts weiter in die schleife. ich dachte ich suche mit PosEx bis ich ">" finde, ist es gefunden so wird ein popupmenu angezeigt. da ist das problem: hat man den cursor aber hinter dem ">", also danach irgentwo (*), so wird zwar "<body" gefunden (logisch) aber es wird nicht drauf geachtet, ob der cursor noch im "gültgen bereich" ist .. kann man da was machen? mir fällt jetzt nix ein was sinn machen würde. |
Re: bis zu einem bestimmten zeichen suchen?
ich hab es mal so probiert das eine abfrage stattfindet ob der cursor sich
zwischen p und p2 befindet mein code klappt aber niciht ganz
Delphi-Quellcode:
procedure TForm1.SynMemo1Change(Sender: TObject); begin CurPosition := SendMessage(SynMemo1.handle,EM_LineIndex,Ln,0); CurPosition := SynMemo1.SelStart-CurPosition; end; for i:= CurPosition downto 0 do begin z:=LowerCase(SynMemo1.Lines[i]); //gleich in Kleinbuchstaben umwandeln :-) p:=Pos('<img',z); if p > 0 then begin inc(p,4); //'<img' übergehen p2 := p; while z[p2] <> '>' do begin inc(p2); //p2 bleibt auf Position von '>' stehen end; if (CurPosition < p-2) and (CurPosition > p2-2) then begin // tue etwas Caption := 'Tue etwas'; // wird nicht angezeigt end; // SynMemo1.Lines[i]:=z; end; end; |
Re: bis zu einem bestimmten zeichen suchen?
will mir keiner mehr helfen :idea: :cry:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz