Esto parece algo que debería ser extremadamente fácil de hacer, pero no lo es, de todas formas no es obvio cómo hacerlo.
Quiero escribir una función en LibreOffice Basic que toma una cadena, un patrón de búsqueda de expresiones regulares y una cadena de reemplazo, y devuelve la cadena modificada por la búsqueda de expresiones regulares y; reemplazar. Como un s/search/replace/g
en sed o perl.
Después de varias horas tratando de dar sentido a la documentación abismal, esto es lo que tengo:
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
El paso a través de esto en el IDE muestra que esto funciona bien, pero no tengo idea de dónde puedo obtener la cadena modificada resultante. T
no está siendo modificado directamente, y no está en ninguna de las found
, search
o opts
objetos tampoco.
Podría escribir un bucle mientras search.SearchForware
y hago la sustitución yo mismo usando el Mid()
declaración - pero entonces estaría restringido a ser reemplazado por cadenas fijas (sin referencias o &
, a menos que yo mismo los implementara. en básico).
Asi que:
- hace configuración
opts.replaceString
actualmente HACER ¿cualquier cosa? - Si es así:
- ¿Qué hace?
- ¿Dónde / cómo recupero el resultado de lo que hace?
Nota: esta pregunta es sobre programación en Libreoffice Basic para devolver una cadena de cambio, y tiene nada en absoluto hacer con hacer una búsqueda y; Reemplace en las celdas con la interfaz de usuario de Libreoffice Calc.
Mid()
como una declaración para reemplazar en lugar deMid()
como una función para extraer. Funciona, pero es torpe, y parece que no debería ser necesario ya queSearchOptions
la estructura en realidad tiene unaReplaceString
objeto. No incluí el bucle en mi pregunta porque quería evitar recibir sugerencias para mejorarlo cuando lo que quiero es información sobre cómo utilizar elreplaceString
así que puedo deshacerme de él por completo.Respuestas:
Parece que ya tiene una solución de trabajo, así que permítame decirle simplemente que lo que busca no parece existir. Con
com.sun.star.util.TextSearch
, XrayTool muestra que ni el objeto de búsqueda ni el resultado encontrado tienen ningún método que realice el reemplazo.AFAICT, SearchOptions.replaceString Solo se utiliza para la sustitución en documentos, por ejemplo.
oDoc.replaceAll(oReplace)
. Ahi estaXStringSubstitution
pero eso solo se usa para Sustitución de ruta .Así que la única manera es hacer el reemplazo usted mismo. Sección 19.2 de Documento macro de Andrew Da una función para reemplazar cadenas por índice.
Personalmente, me encuentro con este tipo de limitación todo el tiempo con Basic, así que prefiero escribir macros en Python-UNO. El manejo de archivos es otra cosa que es innecesariamente difícil en Basic.
Podría ser una buena idea agregar su propia respuesta que muestre la solución que usa
Mid()
En caso de que otras personas encuentren esta pregunta. Entonces probablemente acepte esa respuesta en lugar de la mía.fuente