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/g
in 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. T
nã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.SearchForware
e 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.replaceString
realmenteFAZERqualquer 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.