QRegExp

La mejor manera de realizar búsquedas complejas y de dentro de texto es usando las expresiones regulares. Este es solamente un pequeño ejemplo de como construir e implementar una.

Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas HandelHändel y Haendel se describe mediante el patrón “H(a|ä|ae)ndel”. La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. Específicamente, las expresiones regulares se construyen utilizando los operadores unión, concatenación y clausura de Kleene. Además cada expresión regular tiene un autómata finito asociado.

http://www.wikipedia.org

Vamos a ver un ejemplo en Qt/C++ de como buscar una variable llamada MimeType en un archivo *.desktop,  para luego extraer el valor de la variable.

El proyecto completo puede ser descargado del siguiente link.

Primeramente debemos desglosar nuestra expresión objetivo en el archivo Test.desktop:

  1. La linea objetivo tiene la siguiente forma: Mimetype=El_Valor_Que_Sea
  2. Nuestra expresión está precedida por un cambio de linea.
  3. Seguido a nuestra expresión hay un signo “=”
  4. El valor de la variable puede ser cualquier tipo de caracter y esta comprendido entre el signo “=” y el final de la linea

Veamos la solución para luego desglosarla: ^MimeType\W.*$

^: Este caracter demarca el comienzo de un string y solo coincidirá con las expresiones que comiencen con MimeType

MimeType: Es la variable que queremos buscar, un conjunto de caracteres estándar (a – z).

\W: Corresponde a un carácter que no es una letra o numero.

.*: El punto representa cualquier caracter, y el asterisco, es el cuantificador, lo que quiere decir que pueden haber cero o mas caracteres cualquiera.

$: Y por ultimo tenemos el símbolo que demarca el final de linea.

Veamos un poco de código, he designado la función void process(QString &s) para realizar el procesamiento de la linea de caracteres que queremos buscar y generalizar a otros tipos de variables posibles:

 1 void Widget::process(QString &s)
 2 {
 3  if (s.contains(QRegExp("\\[")))
 4    s.insert(s.indexOf(QRegExp("\\[")), QString("\\"));
 5
 6  if (s.contains(QRegExp("\\]")))
 7    s.insert(s.indexOf(QRegExp("\\]")), QString("\\"));
 8
 9  if (s.contains(QRegExp("\\-")))
10    s.insert(s.indexOf(QRegExp("\\-")), QString("\\"));
11
12  if (s.contains(QRegExp("\\_")))
13    s.insert(s.indexOf(QRegExp("\\_")), QString("\\"));
14
15  s.insert(0, QString("^"));
16  s.append(QString("\\W.*$"));
17 }

La función recibe como parámetro el una referencia al QString que queremos encontrar, primero verificamos si contiene algunos caracteres especiales.

La linea tres verifica si el QString contiene el caracter “[“, notese que se le indicamos al QRegExp el valor de “\\[“, ya que C++ interpreta el back-slash como una secuencia de escape, y necesitamos que el valor definitivo sea “\[“.

Igualmente se realiza para los símbolos “]”, “-” y “_”, que de ser necesarios de incluir en una expresión regular deben estar precedidos por un back-slash.

Finalmente insertamos al comienzo y al final del string los valores de “^” y “\\W.*$” (notese nuevamente el doble back-slash).

Ahora una búsqueda elaborada dentro del archivo, tendría el siguiente aspecto: GenericName[x-test]

Lo cual daría como resultado la expresión regular:  ^GenericName\[x\-test\]\W.*$

Eso es todo por hoy, espero este básico desglose de lo que que podría ser una búsqueda simple en un archivo, les ayude (como a mi), a romper esa barrera que existe ante las expresiones regulares.

No olvides exponer tus inquietudes, dudas y comentarios, todo es bienvenido.

Anuncios

2 responses to “QRegExp

Tu opinión nunca está de más...

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: