Como fazer uma substituição de regex em uma seqüência de caracteres em uma "macro" do LO Basic?

1

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

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

Depois de várias horas tentando entender a documentação abismal, é 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 isso funciona OK, mas não tenho idéia de onde posso obter a sequência modificada resultante. Tnão está sendo modificado diretamente, e não é em qualquer um dos found, searchou optsobjetos também.

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

Assim:

  • não definir opts.replaceStringrealmente FAZER alguma coisa?
  • Se então:
    • O que isso faz?
    • onde / como recupero o resultado do que ele faz?

Nota: esta pergunta é sobre a programação no Libre Office Basic para retornar uma sequência alterada e não tem nada a ver com pesquisar e substituir células com a interface do usuário do Libre Office Calc.

cas
fonte
@ JimK obrigado, sim, eu achei isso aqui ontem. Muito útil e informativo. Na verdade, escrevi um loop semelhante, mas usei Mid()como uma instrução para substituir e não Mid() como uma função para extrair. Funciona, mas é desajeitado - e parece que não deveria ser necessário, pois a SearchOptionsestrutura realmente tem um ReplaceStringobjeto. Não incluí o loop na minha pergunta porque queria evitar dicas sobre como aprimorá-lo quando o que eu quero é informações sobre como fazer uso do replaceStringpara que eu possa me livrar dele completamente.
18718

Respostas:

1

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

AFAICT, SearchOptions.replaceString é usado apenas para substituir em documentos, por exemplo oDoc.replaceAll(oReplace). Existe, XStringSubstitutionmas isso é usado apenas para PathSubstitution .

Portanto, a única maneira é fazer a substituição de si mesmo. A seção 19.2 do documento macro de Andrew fornece uma função para substituir as seqüências de caracteres pelo índice.

Pessoalmente, encontro esse tipo de limitação o tempo todo com o Basic, então prefiro escrever macros no 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 usada Mid()no caso de outras pessoas encontrarem essa pergunta. Então provavelmente aceite essa resposta e não a minha.

Jim K
fonte
+1, mas isso é uma pena - por padrão, o Basic está disponível no LO Calc, enquanto o Python não. Se eu puder distribuir minhas coisas apenas com uma nota "você precisa instalar coisas extras apenas para fazê-las funcionar". Isso quebra um dos meus principais motivos para usar o LO Calc em primeiro lugar, e por que eu tenho me forçado a sofrer a dor de um GUI IDE básico e horrível. Além disso, eu realmente não quero escrever versões ruins de coisas que deveriam ser funções padrão, como um sub-RE. Vou ter que repensar se vale a pena fazer isso com o LO ou simplesmente começar de novo com python ou o que seja.
cas
"O Basic é garantido por estar disponível no LO Calc por padrão, enquanto o Python não." O Python vem com LO por padrão no Windows, e a maioria dos sistemas Linux e Mac já possui o Python instalado. Portanto, não vejo nada de errado em depender do Python ao escrever macros LO. Eu desenvolvi uma grande extensão (12K LOC) usada por pelo menos várias centenas de pessoas e recebi poucas ou nenhuma reclamação sobre o fato de exigir Python. O README da extensão anota a dependência do Python, juntamente com a versão necessária do LO ou AOO.
Jim K