1

Это кажется чем-то, что должно быть чрезвычайно легко сделать, но это не так - в любом случае, конечно, не очевидно, как это сделать.

Я хочу написать функцию в 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 объектов.

Я мог бы написать цикл search.SearchForware и выполните подстановку самостоятельно, используя оператор Mid() но тогда я буду ограничен заменой на фиксированные строки (без обратных ссылок или & , если я сам не реализовал их в Basic).

Так:

  • действительно ли установка opts.replaceString ДЕЛАЕТ что-нибудь?
  • Если так:
    • Что это делает?
    • где / как я могу получить результат того, что он делает?

Примечание: этот вопрос касается программирования в Libre Office Basic для возврата измененной строки и не имеет никакого отношения к выполнению поиска и замены в ячейках с помощью пользовательского интерфейса Libre Office Calc.

1 ответ1

1

Похоже, у вас уже есть рабочее решение, поэтому позвольте мне просто сказать, что то, что вы ищете, кажется, не существует. С com.sun.star.util.TextSearch XrayTool показывает , что ни объект поиска , ни найденный результат имеет какие - либо методы , которые выполняют замену.

AFAICT, SearchOptions.replaceString используется только для замены в документах, например, oDoc.replaceAll(oReplace) . Существует XStringSubstitution но он используется только для PathSubstitution .

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .