This is very old and outdated translation. If you can read English or Russian please use up-to-date English version or Russian version.

If you want to help to update the translation please contact me. New translation is based on GetText and can be edited with weblate.org. It is already machine-translated and need only proof-reading and may be some copy-pasting from here.


P. Cómo puedo usar TRegExpr con Borland C++ Builder?

Tengo un problema porque no hay un archivo de cabecera (.h or .hpp) disponible.

R.

  • Agregar RegExpr.pas al proyecto bcb.
  • Compilar el proyecto. Esto genera el archivo RegExpr.hpp.
  • Ahora se puede escribir código que use la unidad RegExpr.
  • No olvidar agregar #include «RegExpr.hpp» donde haga falta.

P. Porqué TRegExpr devuelve más de una línea?

Por ejemplo, e.r. <font .\*> devuelve la primera línea <font, y entonces el resto del archivo incluso el último </html>.

R.

Por compatibilidad con versiones anteriores el modificador /s está activado por defecto.

Desactivarlo y . encotrará todo menos separadores de línea.

A propósito, le sugiero <font (\[^\\n>\]\*)>, será la URL en Match[1].

P. Porqué TRegExpr devuelve más de lo esperado?

Por ejemplo, la e.r. <p>(.+)</p> aplicada a la cadena <p>a</p><p>b</p> devuelve a</p><p>b pero no a como esperaba.

R.

Por defecto, todos los operadores funcionan en modo voraz, entonces devuelven lo máximo posible.

Para operación no voraz se pueden usar operadores no voraces como +? (nuevo en v. 0.940) o cambiar todos los operadores a modo no voraz con la ayuda del modificador g (usando las propiedades de TRegExpr o construcciones como ?(-g) en la e.r.).

P. Cómo se pueden descomponer textos como HTML con la ayuda de TRegExpr

R.

Lo siento amigos, pero es prácticamente imposible!

Por supuesto, se puede usar fácilmente TRegExpr para extraer alguna información del HTML, como se muestra en mis ejemplos, pero para desomponer en forma precisa hay que usar un código real de descomposición, no e.r.!

Pueden obtener la explicación completa en el libro Perl Cookbook de Tom Christiansen y Nathan Torkington. Brevemente, hay muchas construcciones que són fácilmente descompuestas por el programa apropiado, pero en absoluto por una e.r., y un descomponedor real es MUCHO más rápido porque la e.r. no hace simplemente una búsqueda, incluye una optimización que puede llevar una gran cantidad de tiempo.

P. Hay forma de obtener múltiples coincidencias de una plantilla en TRegExpr?

R.

Se puede hacer un bucle e iterar una por una con el método ExecNext.

No se puede hacer más fácil porque Delphi no es un intérprete como Perl (y es un beneficio, los intérpretes son muy lentos).

Para ver algún ejemplo ver la implementación del método TRegExpr.Replace, o los ejemplos en HyperLinksDecorator.pas

P. Estoy controlando entradas de usuarios. Porqué TRegExpr devuelve True para cadenas incorrectas?

R.

En muchos casos los usuarios de TRegExpr olvidan que las expresiones regulares son para BUSCAR en una cadena. Entonces, si se pretende que un usuario ingrese sólo 4 dígitos y se usa para ello la expresión \\d{4,4}, se puede errar la detección de parámetros incorrectos como 12345 o cualquier letra 1234 y cualquier otra cosa. Hay que agregar control para inicio y fin de línea para asegurarse de que no hay nada alrededor: ^\\d{4,4}$.

P. Porqué los iteradores no voraces a veces funcionan como en modo voraz?

Por ejemplo, la e.r. a+?,b+? aplicada a la cadena aaa,bbb encuentra aaa,b, pero debería No encontrar a,b a causa de la no voracidad del primer iterador?

R.

Esta es la limitación de las matemáticas usadas por TRegExpr (y de las e.r. de Perl y muchos Unix) - e.r. realiza sólo una optimización de búsqueda simple, y no trata de hacer la mejor optimización. En algunos casos esto es malo, pero en los comunes es mayor la ventaja que la limitación - por motivos de rapidez y predecibilidad.

La regla principal - la e.r. antes que nada intenta encontrar coincidencia desde la posición actual y sólo si es completamente imposible avanzar un caracter e intentar nuevamente desde ese lugar. Entonces, si se usa a,b+? se encuentra a,b, pero en el caso de a+?,b+? es no recomendado (a causa de la no voracidad) pero posible encontrar más de una a, entonces TRegExpr lo hace y finalmente obtiene una correcta (pero no óptima) coincidencia. TRegExpr como las e.r. de Perl o Unix no intenta avanzar y volver a chequear - lo que sería una mejor coincidencia. Más aún, esto no puede ser comparado en absoluto en términos de mejor o pero coincidencia.

Por favor, leer [Sintaxis](regular_expressions.html).