如何在 LO Basic“宏”中对字符串进行正则表达式替换?

如何在 LO Basic“宏”中对字符串进行正则表达式替换?

这看起来似乎是一件非常容易做到的事情但事实并非如此——无论如何,如何做到这一点并不明显。

我想在 LibreOffice Basic 中编写一个函数,该函数接受一个字符串、一个正则表达式搜索模式和一个替换字符串,并返回由正则表达式搜索和替换修改的字符串。就像s/search/replace/gsed 或 perl 中的一样。

经过几个小时试图理解这些糟糕的文档后,我得到了以下内容:

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 显示搜索对象和找到的结果都没有任何执行替换的方法。

据我所知,SearchOptions.replaceString仅用于在文档中替换,例如oDoc.replaceAll(oReplace)。有XStringSubstitution,但仅用于路径替换

所以唯一的办法就是自己更换。Andrew 的宏文档给出一个通过索引替换字符串的函数。

就我个人而言,我使用 Basic 时总是遇到这种限制,所以我更喜欢用 Python-UNO 编写宏。文件处理是 Basic 中另一件不必要的困难的事情。

最好添加自己的答案,以防Mid()其他人发现这个问题。然后可能会接受那个答案而不是我的答案。

相关内容