這看起來應該是非常容易做到的事情,但事實並非如此——無論如何,如何做到這一點肯定不明顯。
我想在 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
,但僅用於路徑替換。
所以唯一的辦法就是自己更換。第 19.2 條安德魯的巨集文檔給出一個按索引替換字串的函數.
就我個人而言,我在使用 Basic 時總是遇到這個限制,所以我更喜歡用 Python-UNO 編寫巨集。文件處理是 Basic 中另一個不必要的困難。
添加您自己的答案可能是一個好主意,該答案顯示了使用的解決方案,Mid()
以防其他人發現此問題。然後可能會接受那個答案而不是我的答案。