Как выполнить замену регулярного выражения в строке в «макросе» LO Basic?

Как выполнить замену регулярного выражения в строке в «макросе» LO Basic?

Кажется, что это должно быть очень просто сделать, но это не так — в любом случае, совершенно не очевидно, как это сделать.

Я хочу написать функцию в 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.TextSearchXrayTool показывает, что ни объект поиска, ни найденный результат не имеют методов, которые выполняют замену.

АФАИКТ,SearchOptions.replaceStringиспользуется только для замены в документах, например oDoc.replaceAll(oReplace). Есть XStringSubstitutionно это используется только дляЗамена пути.

Поэтому единственный способ — это сделать замену самостоятельно. Раздел 19.2Макродокумент Эндрюпредоставляет функцию для замены строк по индексу.

Лично я постоянно сталкиваюсь с такого рода ограничениями в Basic, поэтому предпочитаю писать макросы в Python-UNO. Обработка файлов — еще одна вещь, которая неоправданно сложна в Basic.

Может быть хорошей идеей добавить свой собственный ответ, показывающий решение, которое использует Mid(), если другие люди найдут этот вопрос. Тогда, возможно, примите этот ответ, а не мой.

Связанный контент