Main Content

Aserciones de búsqueda anticipada en expresiones regulares

Aserciones de búsqueda anticipada

Hay dos tipos de aserciones de ancho cero para las expresiones regulares: búsqueda anticipada y búsqueda tardía. En ambos casos, la aserción es una condición que debe cumplirse para devolver una coincidencia a la expresión.

Una aserción de búsqueda anticipada tiene la forma (?=test) y pude aparecer en una expresión regular. MATLAB® mira más allá de la ubicación actual en el texto para obtener la condición de la prueba. Si MATLAB coincide con la condición de la prueba, continúa procesando el resto de la expresión para encontrar una coincidencia.

Por ejemplo, busque hacia adelante en un vector de caracteres especificando una ruta para encontrar el nombre del archivo que contiene un archivo de programa (en este caso, fileread.m).

chr = which('fileread')
chr =

    'matlabroot\toolbox\matlab\iofun\fileread.m'
regexp(chr,'\w+(?=\\\w+\.[mp])','match')
ans =

  1×1 cell array

    {'iofun'}

La expresión que coincide, \w+, busca uno o más caracteres alfanuméricos o guiones bajos. Cada vez que regexp encuentra un término que coincide con esta condición, busca hacia adelante una barra invertida (especificado por dos barras invertidas, \\), seguido del nombre de un archivo (\w+) con una extensión .m o .p (\.[mp]). La función regexp devuelve la coincidencia que cumple la condición de búsqueda anticipada, que es el nombre de la carpeta iofun.

Coincidencias superpuestas

Las aserciones de búsqueda anticipada no consumen caracteres en el texto. Como resultado, puede utilizarlas para encontrar secuencias de caracteres superpuestas.

Por ejemplo, utilice las aserciones de búsqueda anticipada para encontrar todas las secuencias de seis caracteres que no son espacios en blanco en un vector de caracteres haciendo coincidir los caracteres iniciales que preceden a los cinco caracteres adicionales:

chr = 'Locate several 6-char. phrases';
startIndex = regexpi(chr,'\S(?=\S{5})')
startIndex =

     1     8     9    16    17    24    25

Los índices de comienzo se corresponden con estas frases:

Locate   severa   everal   6-char   -char.   phrase   hrases

Sin el operador de búsqueda anticipada, MATLAB analiza un vector de caracteres de izquierda a derecha, consumiendo el vector a medida que avanza. Si se encuentran caracteres que coincidan, regexp registra la ubicación y reanuda el análisis del vector de caracteres desde la ubicación de la coincidencia más reciente. No hay superposición de caracteres en este proceso.

chr = 'Locate several 6-char. phrases';
startIndex = regexpi(chr,'\S{6}')
startIndex =

     1     8    16    24

Los índices de comienzo se corresponden con estas frases:

Locate   severa   6-char   phrase

Condiciones de AND lógicos

Otra manera de utilizar una operación de búsqueda anticipada es llevar a cabo un AND lógico entre dos condiciones. Este ejemplo inicialmente intenta localizar todas las consonantes en minúscula en un arreglo de caracteres que consta de los primeros 50 caracteres de la ayuda para la función normest:

helptext = help('normest');
chr = helptext(1:50)
chr =

    ' NORMEST Estimate the matrix 2-norm.
         NORMEST(S'

Buscar solo caracteres que no son vocales ([^aeiou]) no devuelve la respuesta esperada, ya que el resultado no incluye letras en mayúscula, caracteres de espacios ni puntuación:

c = regexp(chr,'[^aeiou]','match')
c =

  1×43 cell array

  Columns 1 through 14

    {' '}    {'N'}    {'O'}    {'R'}    {'M'}    {'E'}    {'S'}    {'T'}    {' '}    {'E'}    {'s'}    {'t'}    {'m'}    {'t'}

  Columns 15 through 28

    {' '}    {'t'}    {'h'}    {' '}    {'m'}    {'t'}    {'r'}    {'x'}    {' '}    {'2'}    {'-'}    {'n'}    {'r'}    {'m'}

  Columns 29 through 42

    {'.'}    {'↵'}    {' '}    {' '}    {' '}    {' '}    {'N'}    {'O'}    {'R'}    {'M'}    {'E'}    {'S'}    {'T'}    {'('}

  Column 43

    {'S'}

Vuelva a intentarlo, utilizando un operador de búsqueda anticipada para crear la siguiente condición AND:

(lowercase letter) AND (not a vowel)

Esta vez el resultado es correcto:

c = regexp(chr,'(?=[a-z])[^aeiou]','match')
c =

  1×13 cell array

    {'s'}    {'t'}    {'m'}    {'t'}    {'t'}    {'h'}    {'m'}    {'t'}    {'r'}    {'x'}    {'n'}    {'r'}    {'m'}

Tenga en cuenta que, cuando utiliza un operador de búsqueda anticipada para llevar a cabo un AND, tiene que colocar la expresión de coincidencia expr después de la expresión de la prueba test:

(?=test)expr or (?!test)expr

Consulte también

| |

Temas relacionados