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

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

Esto parece algo que debería ser extremadamente fácil de hacer, pero no lo es; de todos modos, ciertamente no es obvio cómo hacerlo.

Quiero escribir una función en LibreOffice Basic que tome una cadena, un patrón de búsqueda de expresiones regulares y una cadena de reemplazo, y devuelva la cadena modificada por la búsqueda y reemplazo de expresiones regulares. Como s/search/replace/gen sed o perl.

Después de varias horas intentando darle sentido a la pésima documentación, 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

Revisar esto en el IDE muestra que funciona bien, pero no tengo idea de dónde puedo obtener la cadena modificada resultante. Tno se está modificando directamente y tampoco está en ninguno de los objetos found, searcho opts.

Podría escribir un bucle while search.SearchForwarey hacer la sustitución yo mismo usando la Mid()declaración, pero luego estaría restringido a reemplazar con cadenas fijas (sin referencias anteriores o &, a menos que las haya implementado yo mismo, en Básico).

Entonces:

  • opts.replaceString¿ Realmente se configura?HACER¿cualquier cosa?
  • En ese caso:
    • ¿Qué hace?
    • ¿Dónde/cómo recupero el resultado de lo que hace?

Nota: esta pregunta es sobreprogramaciónen Libre Office Basic para devolver una cadena modificada, y tienenada en absolutoque ver con realizar una búsqueda y reemplazo en celdas con la interfaz de usuario de Libre Office Calc.

Respuesta1

Parece que ya tienes una solución que funciona, así que déjame decirte simplemente que lo que estás buscando 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,Opciones de búsqueda.replaceStringsolo se usa para reemplazar en documentos, por ejemplo oDoc.replaceAll(oReplace). Hay XStringSubstitutionpero eso solo se usa paraRutaSustitución.

Entonces la única manera es reemplazarlo usted mismo. Sección 19.2 deEl documento macro de Andrew.proporciona una función para reemplazar cadenas por índice.

Personalmente, me encuentro con este tipo de limitación todo el tiempo con Basic, por lo que prefiero escribir macros en Python-UNO. El manejo de archivos es otra cosa que resulta innecesariamente difícil en Basic.

Podría ser una buena idea agregar su propia respuesta mostrando la solución utilizada Mid()en caso de que otras personas encuentren esta pregunta. Entonces probablemente acepte esa respuesta en lugar de la mía.

información relacionada