这看起来似乎是一件非常容易做到的事情但事实并非如此——无论如何,如何做到这一点并不明显。
我想在 LibreOffice Basic 中编写一个函数,该函数接受一个字符串、一个正则表达式搜索模式和一个替换字符串,并返回由正则表达式搜索和替换修改的字符串。就像s/search/replace/g
sed 或 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
没有被直接修改,也不在任何found
、search
或opts
对象中。
我可以编写一个 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()
其他人发现这个问题。然后可能会接受那个答案而不是我的答案。