Как выполнить подстановку регулярных выражений в строке в макросе LO Basic?

371
cas

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

Я хочу написать функцию в 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самом деле DO - нибудь?
  • Если так:
    • Что это делает?
    • где / как я могу получить результат того, что он делает?

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

1
@JimK спасибо, да, я нашел это здесь вчера. Очень полезно и информативно. На самом деле я написал похожий цикл, но использовал для замены вместо `Mid ()` функцию Mid (). Это работает, но это неуклюже - и кажется, что в этом нет необходимости, так как структура `SearchOptions` на самом деле имеет объект` ReplaceString`. Я не включил цикл в свой вопрос, потому что хотел избежать советов по его улучшению, когда мне нужна информация о том, как использовать `replaceString`, чтобы я мог полностью от него избавиться. cas 6 лет назад 0

1 ответ на вопрос

1
Jim K

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

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

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

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

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

+1, но это позор - Basic гарантированно будет доступен в LO Calc по умолчанию, а Python - нет. Если я могу распространять свои материалы только с пометкой «вам нужно установить дополнительные материалы, чтобы они работали». Это ломает одну из моих главных причин использования LO Calc и то, почему я заставляю себя страдать от основной и ужасной GUI IDE. Кроме того, я действительно не хочу писать плохие версии вещей, которые должны быть стандартными функциями, такими как RE sub. Мне придется переосмыслить, стоит ли делать это с LO или просто начать заново с python или что-то еще. cas 6 лет назад 0
* «Basic гарантированно будет доступен в LO Calc по умолчанию, а Python - нет.» * Python поставляется с LO по умолчанию в Windows, и в большинстве систем Linux и Mac Python уже установлен. Так что я не вижу ничего плохого в зависимости от Python при написании макросов LO. Я разработал большое (12K LOC) расширение, которым пользуются как минимум несколько сотен человек, и почти не получал жалоб на тот факт, что для него требуется Python. README расширения отмечает зависимость от Python вместе с требуемой версией LO или AOO. Jim K 6 лет назад 0

Похожие вопросы