Wie führe ich eine Regex-Ersetzung für einen String in einem LO Basic-„Makro“ durch?

Wie führe ich eine Regex-Ersetzung für einen String in einem LO Basic-„Makro“ durch?

Dies scheint ziemlich einfach zu sein, ist es aber nicht. Zumindest ist nicht klar, wie es geht.

Ich möchte eine Funktion in LibreOffice Basic schreiben, die einen String, ein Regex-Suchmuster und einen Ersetzungsstring verwendet und den String so zurückgibt, wie er durch die Regex-Suche und -Ersetzung geändert wurde. Wie s/search/replace/gin sed oder Perl.

Nachdem ich mehrere Stunden damit verbracht habe, aus der miserablen Dokumentation einen Sinn zu machen, bin ich zu folgendem Ergebnis gekommen:

Function ReSub (T as String, S as String, R as String) As String
   Dim result as String

   ' In other languages, this is trivially easy.  perl has an s/// operator,
   ' and most other languages have a function call. e.g.
   '
   '   perl:   $result = ($T =~ s/$S/$R/g);
   '   python: result = re.sub(S,R,T)

   search = CreateUnoService("com.sun.star.util.TextSearch")
   opts = CreateUnoStruct("com.sun.star.util.SearchOptions")

   opts.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP

   opts.searchString  = S
   opts.replaceString = R

   search.setOptions(opts)

   found = search.searchForward(T, 0, Len(T))

   ' result = ??????????????
   ReSub = result

End Function

Das Durchgehen in der IDE zeigt, dass es ordnungsgemäß läuft, aber ich habe keine Ahnung, wo ich den resultierenden geänderten String herbekommen kann. Twird nicht direkt geändert und befindet sich auch in keinem der found, search, oder opts-Objekte.

Ich könnte eine while-Schleife herumschreiben search.SearchForwareund die Ersetzung mithilfe der Mid()Anweisung selbst vornehmen – dann wäre ich allerdings auf das Ersetzen durch feste Zeichenfolgen beschränkt (keine Rückverweise oder &, es sei denn, ich habe sie selbst in Basic implementiert).

Also:

  • setzt opts.replaceStringeigentlichTUNirgendetwas?
  • Wenn ja:
    • was tut es?
    • wo/wie rufe ich das Ergebnis dessen ab, was es tut?

Hinweis: Bei dieser Frage geht es umProgrammierungin Libre Office Basic, um eine geänderte Zeichenfolge zurückzugeben, und hatgar nichtshat mit dem Suchen und Ersetzen von Zellen mit der Libre Office Calc-Benutzeroberfläche zu tun.

Antwort1

Es klingt, als hätten Sie bereits eine funktionierende Lösung, also lassen Sie mich einfach sagen, dass das, wonach Sie suchen, nicht zu existieren scheint. Mit com.sun.star.util.TextSearchzeigt XrayTool an, dass weder das Suchobjekt noch das gefundene Ergebnis über Methoden verfügen, die Ersetzungen durchführen.

Soweit ich weiß,SearchOptions.replaceStringwird nur zum Ersetzen in Dokumenten verwendet, z. B. oDoc.replaceAll(oReplace). Es gibt XStringSubstitutionaber das wird nur verwendet fürPfadsubstitution.

Der einzige Weg ist also, den Austausch selbst vorzunehmen. Abschnitt 19.2 vonAndrews Makrodokumentbietet eine Funktion zum Ersetzen von Zeichenfolgen nach Index.

Persönlich stoße ich bei Basic ständig auf derartige Einschränkungen, daher schreibe ich Makros lieber in Python-UNO. Auch die Dateiverwaltung ist in Basic unnötig kompliziert.

Es wäre vielleicht eine gute Idee, Ihre eigene Antwort hinzuzufügen und die verwendete Lösung zu zeigen, Mid()falls andere Leute diese Frage finden. Dann akzeptieren Sie wahrscheinlich eher diese Antwort als meine.

verwandte Informationen