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

1

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

Eu quero escrever uma função no LibreOffice Basic que tenha uma string, um padrão de pesquisa de expressão regular e uma string de substituição, e retorne a string como modificada pela pesquisa regex & substituir. Como um s/search/replace/g em sed ou perl.

Depois de várias horas tentando entender a documentação abismal, é isso que eu 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

Passar por isso no IDE mostra que isso funciona bem, mas não tenho ideia de onde posso obter a sequência modificada resultante. T não está sendo modificado diretamente e não está em nenhum dos objetos found , search ou opts .

Eu poderia escrever um loop while em torno de search.SearchForware e fazer a substituição usando a instrução Mid() - mas ficaria restrito a substituir por strings fixas (sem referências anteriores ou & , a menos que eu implementei eu mesmo em Basic).

Então:

  • define opts.replaceString na verdade DO alguma coisa?
  • Em caso afirmativo:
    • o que isso faz?
    • onde / como recupero o resultado do que ele faz?

Nota: esta questão é sobre programação no Libre Office Basic para retornar uma string alterada, e não tem nada para fazer uma pesquisa & substituir nas células com a interface do usuário do Libre Office Calc.

    
por cas 15.04.2018 / 04:44

1 resposta

1

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

AFAICT, SearchOptions.replaceString é usado apenas para substituir documentos, por exemplo %código%. Há oDoc.replaceAll(oReplace) , mas isso é usado somente para PathSubstitution .

Então, a única maneira é fazer a substituição por si mesmo. A seção 19.2 do documento macro do Andrew dá uma função para substituir as strings pelo índice.

Pessoalmente, eu me deparo com esse tipo de limitação o tempo todo com o Basic, então prefiro escrever macros no Python-UNO. A manipulação de arquivos é outra coisa que é desnecessariamente difícil no Basic.

Pode ser uma boa ideia adicionar sua própria resposta mostrando a solução que usa XStringSubstitution no caso de outras pessoas encontrarem essa pergunta. Então provavelmente aceite essa resposta em vez da minha.

    
por 16.04.2018 / 16:37