Как сделать подстановку regex на строку в базовом "макросе"LO?

это похоже на то, что должно быть очень легко сделать, но это не так - это, конечно, не очевидно, как это сделать, во всяком случае.

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

так:

  • установка opts.replaceString на самом деле DO что-нибудь?
  • если это так:
    • что она делает?
    • где / как получить результат того, что он делает?

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

22
задан cas
21.05.2023 9:38 Количество просмотров материала 2565
Распечатать страницу

1 ответ

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

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

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

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

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

1
отвечен Jim K 2023-05-22 17:26

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх