Como fazer uma substituição de regex em uma string em uma “macro” LO Basic?

Como fazer uma substituição de regex em uma string em uma “macro” LO Basic?

Isso parece algo que deveria ser extremamente fácil de fazer, mas não é - certamente não é óbvio como fazê-lo, de qualquer maneira.

Quero escrever uma função no LibreOffice Basic que receba uma string, um padrão de pesquisa regexp e uma string de substituição e retorne a string modificada pela pesquisa e substituição de regex. Como um s/search/replace/gin sed ou perl.

Depois de várias horas tentando entender a documentação péssima, é isso que tenho:

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

Percorrer isso no IDE mostra que funciona bem, mas não tenho ideia de onde posso obter a string modificada resultante. Tnão está sendo modificado diretamente e também não está em nenhum dos objetos found, search, ou opts.

Eu poderia escrever um loop while search.SearchForwaree fazer a substituição sozinho usando a Mid()instrução - mas ficaria restrito a substituir por strings fixas (sem referências anteriores ou &, a menos que eu mesmo as implementasse. No Basic).

Então:

  • a configuração opts.replaceStringrealmenteFAZERqualquer coisa?
  • Se for assim:
    • O que isso faz?
    • onde/como recupero o resultado do que ele faz?

Nota: esta questão é sobreprogramaçãono Libre Office Basic para retornar uma string alterada e temnada mesmotem a ver com pesquisar e substituir células com a interface de usuário do Libre Office Calc.

Responder1

Parece que você já tem uma solução funcional, então deixe-me simplesmente dizer que o que você está procurando parece não existir. Com com.sun.star.util.TextSearch, XrayTool mostra que nem o objeto de pesquisa nem o resultado encontrado possuem métodos que realizam a substituição.

AFAITO,SearchOptions.replaceStringsó é usado para substituir em documentos, por exemplo oDoc.replaceAll(oReplace). Existe XStringSubstitution, mas isso só é usado paraSubstituição de caminho.

Portanto, a única maneira é você mesmo fazer a substituição. Seção 19.2 deDocumento macro de Andrewfornece uma função para substituir strings por índice.

Pessoalmente, encontro esse tipo de limitação o tempo todo com o Basic, então prefiro escrever macros em Python-UNO. O manuseio de arquivos é outra coisa desnecessariamente difícil no Basic.

Pode ser uma boa ideia adicionar sua própria resposta mostrando a solução a ser usada Mid()caso outras pessoas encontrem essa pergunta. Então provavelmente aceite essa resposta em vez da minha.

informação relacionada