LO Basic「マクロ」内の文字列に対して正規表現の置換を行うにはどうすればよいでしょうか?

LO Basic「マクロ」内の文字列に対して正規表現の置換を行うにはどうすればよいでしょうか?

これは非常に簡単に実行できるように思えますが、実際はそうではありません。とにかく、どのように実行すればよいのかは明らかではありません。

LibreOffice Basic で、文字列、正規表現検索パターン、置換文字列を受け取り、正規表現検索と置換によって変更された文字列を返す関数を記述したいと考えています。seds/search/replace/gや perl の a のようなものです。

ひどいドキュメントを理解しようと数時間費やした結果、次のことがわかりました。

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

IDE でこれをステップ実行すると、正常に実行されることがわかりますが、結果として得られる変更された文字列をどこから取得できるかわかりません。 は 直接変更されておらず、、、またはオブジェクトTのいずれにも存在しません。foundsearchopts

while ループを記述しsearch.SearchForware、ステートメントを使用して自分で置換を行うこともできますMid()が、その場合、固定文字列での置換に制限されます ( &Basic で自分で実装しない限り、後方参照や は使用できません)。

それで:

  • opts.replaceString実際に設定する何でも?
  • もしそうなら:
    • それは何をするためのものか?
    • 実行結果はどこでどのように取得できますか?

注: この質問はプログラミングLibre Office Basicでは変更された文字列を返すように設定されており、何もないLibre Office Calc ユーザー インターフェイスを使用してセルの検索と置換を行うことに関係します。

答え1

すでに機能するソリューションをお持ちのようですので、探しているものは存在しないようです、とだけ言わせてください。 を使用するとcom.sun.star.util.TextSearch、XrayTool は、検索オブジェクトにも検索結果にも置換を実行するメソッドがないことを示しています。

私の知る限り、検索オプション.置換文字列は、例えば文書内での置換にのみ使用されますoDoc.replaceAll(oReplace)。 はありますXStringSubstitutionが、 は、パス置換

したがって、唯一の方法は自分で交換することです。アンドリューのマクロ文書インデックスによって文字列を置き換える関数を提供します。

個人的には、Basic ではこの種の制限にいつも遭遇するので、代わりに Python-UNO でマクロを書くことを好みます。ファイルの処理も、Basic では不必要に難しいことです。

他の人がこの質問を見つけた場合に備えて、使用する解決策を示す独自の回答を追加するとよいかもしれませんMid()。そうすれば、おそらく私の回答ではなく、その回答が受け入れられるでしょう。

関連情報