Die verschobene Regex-Diskussion ist mir Recht, ich hätte sonst gewartet, bis sich das Thema gelegt hat~
Über die Stringmanipulationen bin ich nämlich auch schon gestolpert und habe (vielleicht mangels Pascal-String-Wissen) mir letztlich eine eigene Bibliothek geschrieben, die sich an den String-Routinen von FORTRAN orientiert. Ich komm damit recht gut zurecht, es wäre aber interessant zu wissen, wie man das mit Pascal-Mitteln (besser) direkt macht.
Es gibt also INDEX, SCAN, VERIFY.
INDEX gibt die erste Position eines Suchstrings im String zurück.
SCAN gibt die erste Position eines beliebigen Zeichens des Suchstrings im String zurück.
VERIFY gibt die erste Position eines Zeichens im String zurück, das nicht im Suchstring enthalten ist.
Beispiele:
Code: Alles auswählen
pp: Integer;
pp:= INDEX('Hallo Welt','Welt'); //pp:= 7
pp:= SCAN('Hallo Welt','abc'); //pp:= 2
pp:= VERIFY('Hallo Welt','Hal'); //pp:= 5
Die Funktionen können dann optional auch noch Start- und Endpositionen haben:
Code: Alles auswählen
pp2:= SCAN(' Hallo Welt',' '+#9,2); //pp2:= 7 //finde erstes Space oder Tab ab Zeichen 2
pp3:= VERIFY(' Hallo Welt',' '+#9, pp2); //pp3:= 8 //finde erstes Zeichen nach Space/Tab
if pp3 = 0 then writeln('Fehler: Zweites Wort erwartet aber nicht vorhanden');
Mit diesen Funktionen kann man sich dann schön linear durch den String durcharbeiten. Ich würde auch behaupten, dass das agorithmisch relativ schnell ist, weil auf Zwischenkopien verzichtet wird. Ein Problem sind aber Zeichenbereiche a-z, 0-9, die jeweils einzeln durchlaufen werden. Man bräuchte da vielleicht noch Spezialfunktionen.
Mit einer zusätzlichen Kopiefunktion AbsCopy kann man dann noch Substrings mit den Absolutpositionen rauskopieren:
Code: Alles auswählen
pp2:= SCAN('Hallo Welt ',' '+#9); //pp2:= 6 //finde erstes Space oder Tab
pp3:= VERIFY('Hallo Welt ',' '+#9, pp2); //pp3:= 7 //finde erstes Zeichen nach Space/Tab
pp4:= RTrim('Hallo Welt '); //Erste Position von rechts, wo keine Leerzeichen sind
if pp3 <> 0 then ZweitesWort:= AbsCopy('Hallo Welt', pp3, pp4); //ZweitesWort:= 'Welt'
Also wie würde so etwas mit vorgegebenen Pascal-Routinen aussehen (auch in Hinblick auf komplizierteres Parsen, wo ein einfaches split nicht reicht)?