¿Cómo hacer una sustitución de expresiones regulares en una cadena en una “macro” LO Basic?

1

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, searcho 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.

cas
fuente
@JimK gracias, sí, encontré eso aquí ayer. Muy útil y amp; informativo. De hecho, escribí un bucle similar pero usé Mid() como una declaración para reemplazar en lugar de Mid() como una función para extraer. Funciona, pero es torpe, y parece que no debería ser necesario ya que SearchOptions la estructura en realidad tiene una ReplaceString 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 el replaceString así que puedo deshacerme de él por completo.
cas

Respuestas:

1

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 esta XStringSubstitution 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.

Jim K
fuente
+1, pero es una pena: se garantiza que Basic está disponible en LO Calc de forma predeterminada, mientras que Python no lo está. Si solo puedo distribuir mis cosas con una nota "tienes que instalar cosas adicionales para que funcionen". Esto rompe una de mis razones principales para usar LO Calc en primer lugar, y por eso me he estado forzando a sufrir el dolor del GUI IDE básico y horrible. Además, realmente no quiero escribir versiones de mala calidad de cosas que deberían ser funciones estándar, como un sub RE. Voy a tener que volver a pensar si vale la pena hacer esto con LO o simplemente comenzar de nuevo con Python o lo que sea.
cas
"Se garantiza que Basic está disponible en LO Calc de forma predeterminada, mientras que Python no lo está". Python viene con LO de forma predeterminada en Windows, y la mayoría de los sistemas Linux y Mac ya tienen instalado Python. Así que no veo nada malo en depender de Python al escribir macros LO. He desarrollado una extensión grande (12K LOC) utilizada por al menos varios cientos de personas y he recibido pocas o ninguna queja sobre el hecho de que requiere Python. El archivo README de la extensión indica la dependencia de Python junto con la versión requerida de LO o AOO.
Jim K