Wie mache ich eine Regex-Substitution an einer Zeichenfolge in einem LO Basic "Makro"?

394
cas

Dies scheint etwas zu sein, das extrem einfach sein sollte, aber es ist nicht - es ist jedenfalls nicht offensichtlich, wie es geht.

Ich möchte eine Funktion in LibreOffice Basic schreiben, die eine Zeichenfolge, ein Regex-Suchmuster und eine Ersetzungszeichenfolge übernimmt und die Zeichenfolge zurückgibt, die von der Regex-Suche und dem Ersetzen geändert wurde. Wie ein s/search/replace/gin sed oder perl.

Nachdem ich mehrere Stunden versucht hatte, die abgründige Dokumentation zu verstehen, habe ich Folgendes:

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 Durchlaufen der IDE in der IDE zeigt, dass dies in Ordnung ist, aber ich habe keine Ahnung, wo ich die resultierende modifizierte Zeichenfolge abrufen kann. Tist nicht direkt geändert werden, und es ist nicht an dem ein found, searchoder optsentweder Objekten.

Ich könnte eine while-Schleife herumschreiben search.SearchForwareund die Ersetzung mithilfe der Mid()Anweisung selbst vornehmen - aber dann wäre ich darauf beschränkt, durch feste Zeichenfolgen ersetzt zu werden (keine Rückverweise oder &, sofern ich sie nicht selbst implementiert habe. In Basic).

So:

  • nicht Einstellung opts.replaceStringtatsächlich DO etwas?
  • Wenn ja:
    • was tut es?
    • Wo / Wie erhalte ich das Ergebnis dessen, was es tut?

Hinweis: Bei dieser Frage geht es um das Programmieren in Libre Office Basic zur Rückgabe einer geänderten Zeichenfolge. Sie hat nichts mit Suchen und Ersetzen von Zellen mit der Libre Office Calc-Benutzeroberfläche zu tun.

1
@JimK Danke, ja, ich habe das gestern hier gefunden. Sehr nützlich und informativ. Ich habe tatsächlich eine ähnliche Schleife geschrieben, aber "Mid ()" als Anweisung zum Ersetzen anstelle von "Mid ()" als zu extrahierende Funktion verwendet. Es funktioniert, aber es ist ungeschickt - und scheint nicht notwendig zu sein, da die `SearchOptions'-Struktur tatsächlich ein` ReplaceString'-Objekt hat. Ich habe die Schleife nicht in meine Frage aufgenommen, weil ich vermeiden wollte, Tipps zu ihrer Verbesserung zu erhalten, wenn ich Informationen über die Verwendung des `replaceString 'erhalten möchte, damit ich sie vollständig loswerden kann. cas vor 6 Jahren 0

1 Antwort auf die Frage

1
Jim K

Es klingt, als hätten Sie bereits eine funktionierende Lösung. Lassen Sie mich einfach sagen, dass das, wonach Sie suchen, nicht zu existieren scheint. Mit com.sun.star.util.TextSearchXrayTool wird angezeigt, dass weder das Suchobjekt noch das gefundene Ergebnis über Methoden verfügt, die das Ersetzen durchführen.

AFAICT, SearchOptions.replaceString wird beispielsweise nur zum Ersetzen in Dokumenten verwendet oDoc.replaceAll(oReplace). Es gibt XStringSubstitutionaber das wird nur für PathSubstitution verwendet .

Der einzige Weg ist also, sich selbst zu ersetzen. In Abschnitt 19.2 des Andrew-Makrodokuments wird eine Funktion zum Ersetzen von Zeichenfolgen durch den Index angegeben.

Persönlich stoße ich bei Basic immer auf diese Art von Einschränkung. Deshalb ziehe ich es vor, Makros in Python-UNO zu schreiben. Dateibehandlung ist eine andere Sache, die in Basic unnötig schwierig ist.

Es kann eine gute Idee sein, eine eigene Antwort hinzuzufügen, die die Lösung zeigt, die verwendet wird, Mid()wenn andere Personen diese Frage finden. Dann akzeptiere diese Antwort wahrscheinlich eher als meine.

+1 aber das ist eine Schande - Basic ist standardmäßig in LO Calc verfügbar, Python jedoch nicht. Wenn ich meine Sachen nur mit einer Notiz verteilen kann, "müssen Sie zusätzliche Sachen installieren, damit es funktioniert". Dies ist einer der Hauptgründe für die Verwendung von LO Calc und der Grund, warum ich mich gezwungen habe, den Schmerz einer grundlegenden und einer schrecklichen GUI-IDE zu erleiden. Ich möchte auch keine schlimmen Versionen von Dingen schreiben, die Standardfunktionen sein sollten, wie ein RE-U-Boot. Ich werde überdenken müssen, ob es sich lohnt, dies mit LO zu tun oder einfach mit Python oder so zu beginnen. cas vor 6 Jahren 0
* "Basic ist standardmäßig in LO Calc verfügbar, Python jedoch nicht." * Python wird standardmäßig mit LO unter Windows geliefert, und auf den meisten Linux- und Mac-Systemen ist Python bereits installiert. Ich sehe also nichts falsches, wenn man beim Schreiben von LO-Makros von Python abhängt. Ich habe eine große Erweiterung (12K LOC) entwickelt, die von mindestens einigen Hundert Menschen verwendet wird, und ich habe wenig bis keine Klagen darüber erhalten, dass Python erforderlich ist. In der README-Datei der Erweiterung wird die Abhängigkeit von Python sowie die erforderliche Version von LO oder AOO angegeben. Jim K vor 6 Jahren 0