如何對 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,但僅用於路徑替換

所以唯一的辦法就是自己更換。第 19.2 條安德魯的巨集文檔給出一個按索引替換字串的函數.

就我個人而言,我在使用 Basic 時總是遇到這個限制,所以我更喜歡用 Python-UNO 編寫巨集。文件處理是 Basic 中另一個不必要的困難。

添加您自己的答案可能是一個好主意,該答案顯示了使用的解決方案,Mid()以防其他人發現此問題。然後可能會接受那個答案而不是我的答案。

相關內容