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/g
sed 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. T
não está sendo modificado diretamente, e não é em qualquer um dos found
, search
ou opts
objetos também.
Eu poderia escrever um loop while search.SearchForware
e 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.replaceString
realmente 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.
Mid()
como uma instrução para substituir e nãoMid()
como uma função para extrair. Funciona, mas é desajeitado - e parece que não deveria ser necessário, pois aSearchOptions
estrutura realmente tem umReplaceString
objeto. 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 doreplaceString
para que eu possa me livrar dele completamente.Respostas:
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,XStringSubstitution
mas 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.fonte