Neue Funktionen in R-BASIC 1.024. Suchen in Text-ObjektenDas Suchen von Textpassagen in längeren Texten gehört häufig zu den grundlegenden Aufgaben von Programmen. R-BASIC unterstützt die Suche in Strings mit den Funktionen InStr (Finden von Textpassagen), CountStr (Zählen, wie oft Textpassagen vorkommen) und ReplaceStr$ (Ersetzen von Textpassagen). Texte in Textobjekten können jedoch länger als die maximale Textlänge in R-BASIC sein (das sind max. 1024 Zeichen). Deswegen unterstützt R-BASIC für alle Textobjekte (Memo, InputLine, LargeText und VisText) die Methoden FindString (Finden von Textpassagen), FindStringBackward (Rückwärtssuche nach Textpassagen), CountString (Zählen, wie oft Textpassagen vorkommen) sowie ReplaceString (Ersetzen von Textpassagen).Die Varianten FindStringWW, FindStringBackwardWW, CountStringWW und ReplaceStringWW suchen nach "ganzen Wörtern" (engl. whole words). Allgemeine Hinweise:
FindStringDie Methode FindString ermittelt die Cursor-Position, ab welcher A$ im Text des Text-Objekts zu finden ist. Der Suchbereich kann eingeschränkt werden.Standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden (ignoreCase = FALSE).
Syntax: <numVar> = <obj>.FindString A$ [,start [,end [,ignoreCase]]]
Parameter: A$ : String-Ausdruck: der zu findende String
start (optional) Beginn des Suchbereichs. Default: Null
end (optional) Ende des Suchbereichs: Default: -1
Übergeben Sie den Wert -1, wenn der Text bis
zum Ende durchsucht werden soll.
ignoreCase (optional) Groß/Kleinschreibung ignorieren (TRUE)
oder berücksichtigen (FALSE, Default)
Return: Cursor-Position der Fundstelle (Null entspricht dem Textanfang) bzw.
-1, wenn der String A$ nicht gefunden wurde.
Beispiele: | ||||||||||||||||||||||||||||
DIM pos
pos = MyText.FindString "Paula" ' gesamten Text durchsuchen
pos = MyText.FindString "Paula", 12, 200
' Text im Bereich der Zeichenpositionen 12 bis 200
' durchsuchen
pos = MyText.FindString "paulA", 0, -1, TRUE
' gesamten Text durchsuchen, Groß/Kleinschreibung ignorieren
| ||||||||||||||||||||||||||||
FindStringBackwardDie Methode FindStringBackward ermittelt die Cursor-Position, ab welcher A$ im Text des Text-Objekts zu finden ist, wobei die Suche am Ende des Suchbereichs beginnt. Wird z.B. nach "Hallo" gesucht, so ist der Rückgabewert die Cursorposition des Buchstabens 'H'. Der Suchbereich kann eingeschränkt werden. Standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden (ignoreCase = FALSE).
Syntax: <numVar> = <obj>.FindStringBackward A$ [,start [,end [,ignoreCase]]]
Parameter: A$ : String-Ausdruck: der zu findende String
start (optional) Beginn des Suchbereichs. Default: Null
end (optional) Ende des Suchbereichs: Default: -1
Übergeben Sie den Wert -1, wenn der Text ab
dem Ende durchsucht werden soll.
ignoreCase (optional) Groß/Kleinschreibung ignorieren (TRUE)
oder berücksichtigen (FALSE, Default)
Return: Cursor-Position der Fundstelle (Null entspricht dem Textanfang) bzw.
-1, wenn der String A$ nicht gefunden wurde.
Beispiele: | ||||||||||||||||||||||||||||
DIM pos
pos = MyText.FindStringBackward "Paula"
' gesamten Text durchsuchen
pos = MyText.FindStringBackward "paulA", 0, -1, TRUE
' gesamten Text durchsuchen, Groß/Kleinschreibung ignorieren
| ||||||||||||||||||||||||||||
CountStringDie Methode CountString ermittelt, wie oft A$ im Text des Text-Objekts zu finden ist. Der Suchbereich kann eingeschränkt werden.Standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden (ignoreCase = FALSE).
Syntax: <numVar> = <obj>.CountString A$ [,start [,end [,ignoreCase]]]
Parameter: A$ : String-Ausdruck: der zu findende String
start (optional) Beginn des Suchbereichs. Default: Null
end (optional) Ende des Suchbereichs: Default: -1
Übergeben Sie den Wert -1, wenn der Text bis
zum Ende durchsucht werden soll.
ignoreCase (optional) Groß/Kleinschreibung ignorieren (TRUE)
oder berücksichtigen (FALSE, Default)
Return: Häufigkeit des Auftretens des Strings A$ im Suchbereich.
Hinweis: Bereits gefundene Textstellen werden nicht noch einmal berücksichtigt. Enthält der Text beispielsweise die Zeichenfolge "ahaha", so wird bei der Suche nach "aha" nur ein Auftreten gefunden. Beispiele: | ||||||||||||||||||||||||||||
DIM pos
pos = MyText.CountString, "Paula" ' gesamten Text durchsuchen
pos = MyText.CountString, "Paula", 10, 30 ' eingeschränkte Suche
pos = MyText.CountString, "paulA", 0, -1, TRUE
' gesamten Text durchsuchen, Groß/Kleinschreibung ignorieren
| ||||||||||||||||||||||||||||
ReplaceStringDie Methode ReplaceString realisiert eine "Alles Ersetzen"-Funktion für Textobjekte. Jedes Auftreten der Zeichenfolge A$ wird ohne Nachfrage durch die Zeichenfolge B$ ersetzt. Der Bereich, in dem ersetzt wird, kann eingeschränkt werden.Standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden (ignoreCase = FALSE).
Syntax: <obj>.ReplaceString A$, B$ [,start [,end [,ignoreCase]]]
Parameter: A$ : String-Ausdruck: der zu findende String
B$ : String-Ausdruck: neuer Text
start (optional) Beginn des Suchbereichs. Default: Null
end (optional) Ende des Suchbereichs: Default: -1
Übergeben Sie den Wert -1, wenn der Text bis
zum Ende durchsucht werden soll.
ignoreCase (optional) Groß/Kleinschreibung ignorieren (TRUE)
oder berücksichtigen (FALSE, Default)
Hinweis: Beachten Sie, dass der Text durch das Ersetzten länger werden kann. Dadurch kann er möglicherweise nicht mehr vom Text-Objekt aufgenommen werden. Darüber erfolgt keine Fehlermeldung! Der Suchtext wird dann einfach nicht ersetzt. Sie können die Methode CountString verwenden, um herauszufinden wie oft der zu ersetzende Text im Suchbereich vorkommt. Außerdem können Sie vor dem Ersetzen die aktuelle Textlänge (Instancevariable textLen) und die maximale Textlänge (Instancevariable maxLen) abfragen. Für LargeText-Objekte existiert dieses Problem nicht. Beispiele: | ||||||||||||||||||||||||||||
DIM count
count = MyText.CountString "Paula" ' gesamten Text durchsuchen
count = MyText.CountString "paulA", 0, -1, TRUE
' gesamten Text durchsuchen, Groß/Kleinschreibung ignorieren
| ||||||||||||||||||||||||||||
FindStringWW, FindStringBackwardWW, CountStringWW, ReplaceStringWWDiese Varianten der Methoden prüfen zusätzlich, ob eine Fundstelle als "ganzen Wort" (engl. whole word) aufgefasst werden kann. Nur dann akzeptieren sie die Fundstelle.Beispiel: Suche nach "all" in einem Text, der nur aus dem Wort "Hallo" besteht:
Eine Textstelle zählt als "ganzes Wort", wenn sich davor und danach kein Zeichen befindet, das Teil eines Wortes sein kann. Welche Zeichen Teil eines Wortes sein können, hängt möglicherweise von den Umständen ab. R-BASIC verwendet die folgenden Regeln: Teil eines Wortes kann sein:
Beachten Sie das führende Leerzeichen im letzten Beispiel!
Suchen und WeitersuchenIn vielen Fällen wollen Sie sich nicht mit der ersten Fundstelle zufriedengeben, sondern auch die weiteren Fundstellen finden. Die folgenden Routinen zeigen, wie das prinzipiell gemacht wird. Die Idee ist, dass Sie für die nächste Suche die aktuelle Fundstelle ausklammern. Für eine Vorwärtssuche müssen Sie also den Suchbereich auf den Bereich nach der letzten Fundstelle einschränken, für eine Rückwärtssuche müssen Sie den Suchbereich auf den Bereich vor der letzten Fundstelle einschränken.Die FindString-Methoden sind dabei so programmiert, dass Sie selbst keine Sonderfälle berücksichtigen müssen, Sie können also ruhig so lange weitermachen, bis die Meldung "nicht gefunden" kommt. Ein komplettes Beispiel mit verschiedenen Suchvarianten finden Sie Beispieldatei "Such-Demo" im Ordner "Beispiel\Objekte\Text". | ||||||||||||||||||||||||||||
SUB FindSimple ()
DIM t$, pos, start
t$ = SuchText.text$
start = 0
pos = FindLargeText.FindString t$ start, -1
WHILE pos >= 0
MsgBox "Gefunden auf Position "+Str$(pos)
start = pos + Len(t$)
pos = FindLargeText.FindString t$ start, -1
WEND
MsgBox "Nicht gefunden"
END SUB 'FindSimple
| ||||||||||||||||||||||||||||
SUB FindSimpleBackward ()
DIM t$, pos, sEnd
t$ = SuchText.text$
sEnd = -1
pos = FindLargeText.FindStringBackward t$ 0, sEnd
WHILE pos >= 0
MsgBox "Gefunden auf Position "+Str$(pos)
sEnd = pos
pos = FindLargeText.FindStringBackward t$ 0, sEnd
WEND
MsgBox "Nicht gefunden"
End SUB 'FindSimpleBackward
| ||||||||||||||||||||||||||||
|
Ein weiterer häufiger Fall ist das Ersetzen des gefundenen Strings mit Nachfrage. Die folgende Function FindAndReplace zeigt, wie man das realisieren kann.
Beim Ersetzen von Zeichenketten innerhalb eines Textes kann sich der Text verlängern oder verkürzen. Bei der Vorwärtssuche (aber nicht bei der Rückwärtssuche) muss man das bei der Berechnung der neuen Startposition berücksichtigen. Die Funktion FindAndReplace berechnet diese Längenänderung in der Variablen diff. So kann sie gleich die neue Suchposition für den nächsten Aufruf von FindAndReplace zurückgeben. Außerdem zeigt der Code, wie man eine Fundstelle im Text für den Nutzer sichtbar markieren kann. | ||||||||||||||||||||||||||||
FUNCTION FindAndReplace \
(textObj AS OBJECT, old$, new$ AS STRING, startpos AS REAL) AS REAL
DIM foundPos, newPos, cmd, diff
foundPos = textObj.FindString old$, startPos, -1
IF foundPos = -1 THEN RETURN -1 ' Nicht mehr gefunden
' Fundstelle markieren
textObj.cursorPos = foundPos
textObj.selectionLen = Len(old$)
Target = textObj ' Sichtbarkeit sicherstellen
' Nachfragen
cmd = QuestionBox ("Dieses Auftreten ersetzen?")
IF cmd = YES THEN
textObj.ReplaceSelection new$
' Neue Startposition berechnen
' Die Textlänge kann sich geändert haben
diff = Len(new$) - Len(old$)
newPos = foundPos + Len(old$) + diff
ELSE
' nur die neue Startposition berechnen
newPos = foundPos + Len(old$)
End IF
RETURN newPos
End FUNCTION 'FindAndReplace
| ||||||||||||||||||||||||||||
| Code-Beispiel: Einfacher Aufruf der Funktion FindAndReplace. Jedes Auftreten der Zeichenkette "Paul" wird auf Nachfrage durch "Fred" ersetzt. | ||||||||||||||||||||||||||||
DIM startpos
sPos = 0
REPEAT
sPos = FindAndReplace (MyTextObj, "Paul", "Fred", sPos)
UNTIL sPos = -1
| ||||||||||||||||||||||||||||
^ |