![]() |
String zerlegen
In einem String sind Zeichenfolgen mit # eingeschlossen. Was ich jetzt brauche sind die Zeichenfolgen dazwischen.
Beispiel: '#Beleg-Prefix##Belegnummer#' Ich brauche jetzt Beleg-Prefix und Belegnummer. Mit diesem Code:
Delphi-Quellcode:
geht das schon ganz gut, bis auf die Tatsache, dass ich imme rnoch das abschliessende ' im Memo stehen. OK. So weit so gut. Jetzt kann aber auch folgendes auftreten:
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer; idx_start, idx_end: Integer; s : string; KeyWord : string; begin i := 0; s := Edit1.Text; DebugLog(s); idx_start := 1; repeat idx_start := PosEx('#', s, idx_start + 1); //DebugLog('idx_start: ' + IntToStr(idx_start)); idx_end := PosEx('#', s, idx_start + 1); //DebugLog('idx_end: ' + IntToStr(idx_end)); KeyWord := copy(s, idx_start + 1, idx_end - idx_start - 1); DebugLog(KeyWord); idx_start := idx_end; Inc(i); until idx_end < i; '#Beleg-Prefix#foobar#Belegnummer#' Das foobar darf ich jetzt aber nicht extrahieren, da die # zu dem Wort davor und danach gehören. Und genau daran scheitere ich im Moment. Mein bisheriger Code (siehe oben) zieht das foobar immer noch mit raus, was aber, wie gesagt, nicht sein darf. Entwicklen tue ich das zur Zeit unter D6 Enterprise. Brauchen tue ich den Code aber dann unter BDS2006, das heißt ich könnte eventuell auf Sprachmitten zurückgreifen, die erst ab BDS2006 zur Verfügung stehen. |
Re: String zerlegen
Wie ist foobar erkennbar?
|
Re: String zerlegen
Hi Luckie,
füg doch
Delphi-Quellcode:
ein.
s := copy(s, idx_end, Length(s));
|
Re: String zerlegen
Zitat:
#Beleg-Prefix#foobar#Belegnummer#' @kalmi: An welcher Stelle soll ich das einfügen? |
Re: String zerlegen
Update:
@kalmi01: Das war die Lösung.
Delphi-Quellcode:
So geht es mit '#Beleg-Prefix#foobar#Belegnummer#' als auch mit '#Beleg-Prefix##Belegnummer#'. Danke.
repeat
idx_start := PosEx('#', s, 1); //DebugLog('idx_start: ' + IntToStr(idx_start)); idx_end := PosEx('#', s, idx_start + 1); //DebugLog('idx_end: ' + IntToStr(idx_end)); KeyWord := copy(s, idx_start + 1, idx_end - idx_start - 1); DebugLog(KeyWord); Inc(i); s := copy(s, idx_end + 1, Length(s)); until idx_end < i; |
Re: String zerlegen
Liste der Anhänge anzeigen (Anzahl: 1)
Is' doch ein Paradebeispiel für reguläre Ausdrücke. :-)
Delphi-Quellcode:
procedure TForm33.btn_DoNowClick(Sender: TObject);
var reg : TPerlRegEx; begin Memo1.Clear; reg:= TPerlRegEx.Create( NIL ); TRY reg.Subject:= edt_SourceString.Text; reg.RegEx:= '\#([0-9a-zA-Z_\-])+\#'; if reg.Match then begin Memo1.Lines.Add( reg.MatchedExpression ); while reg.MatchAgain do begin Memo1.Lines.Add( reg.MatchedExpression ); end; end else Memo1.Lines.Add( 'nichts gefunden' ); FINALLY reg.Free; END; end; Dafür muss man auch keine Komponente installieren, nur die Unit in den Suchpfad und gut is'. ( ![]() [edit] URL korrigiert. [/edit] |
Re: String zerlegen
Das sieht natürlich besser aus. Allerdings gibt es auf der verlinkten Webseite kein TPerlregEx sondern nur ein TRegEpr, was aber nicht kompatibel ist. Aber unter BDS2006 ist doch schon eine entsprechende Unit dabei oder?
|
Re: String zerlegen
Na, das Problem ist ja jetzt auch gelöst, von daher ist's eigentlich egal. Aber der Vollständigkeit halber hier mal die korrekte URL:
![]() |
Re: String zerlegen
Ohne RegEx geht's so:
Delphi-Quellcode:
Gruß Hawkeye
procedure SplitString (const s: string; L: TStrings; Delimiter: Char = '#');
var k : Integer; kFrom : Integer; Inside : Boolean; begin kFrom := 1; Inside := False; for k := 1 to Length(s) do if (s[k] = Delimiter) then begin if Inside then L.Add(Copy(s, kFrom, k - kFrom)) else kFrom := k + 1; Inside := not Inside; end; end; procedure TForm1.Button1Click (Sender: TObject); var S : TStrings; begin S := TStringList.Create; try SplitString ('#Beleg-Prefix#foobar#Belegnummer#', S, '#'); finally S.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz