Expresiones regulares

Las expresiones regulares son un lenguaje formal  utilizado en programas informáticos que trabajan con texto para buscar y manipular subcadenas en el texto , basándose en el uso de metacaracteres ( caracteres comodín ) . Para buscar, se utiliza una cadena de patrón ( patrón en inglés , en ruso a menudo se le llama "plantilla", "máscara"), que consta de caracteres y metacaracteres y establece la regla de búsqueda. Para manipulaciones con texto, se especifica adicionalmente una cadena de reemplazo, que también puede contener caracteres especiales.   

Características

Algunos editores de texto y utilidades utilizan expresiones regulares para buscar y sustituir texto. Por ejemplo, al usar expresiones regulares, puede especificar patrones que le permitan:

Las expresiones regulares también le permiten especificar patrones de búsqueda o reemplazo mucho más complejos.

El resultado de trabajar con una expresión regular puede ser:

Si se usa una expresión regular para reemplazar texto, el resultado del trabajo será una nueva cadena de texto, que es el texto de origen, de la cual se eliminan las subcadenas encontradas (que coinciden con el patrón) y se sustituyen las cadenas de reemplazo (posiblemente modificado por grupos de caracteres recordados durante el análisis del texto fuente). Un caso especial de modificación de texto es la eliminación de todas las ocurrencias del patrón encontrado, para el cual la cadena de reemplazo se especifica vacía.

El conjunto de utilidades (incluido el editor sed y el filtro grep ) que se incluyen con las distribuciones de UNIX fueron de los primeros en popularizar las expresiones regulares para el procesamiento de textos. Muchos lenguajes de programación modernos tienen soporte integrado para expresiones regulares. Entre ellos se encuentran ActionScript , Perl , Java [1] , PHP , JavaScript , lenguajes .NET Framework [2] , Python , Tcl , Ruby , Lua , Gambas , C++ ( estándar 2011 ), Delphi , D , Haxe y otros.

Historia

Los orígenes de las expresiones regulares se encuentran en la teoría de los autómatas , la teoría de los lenguajes formales y la clasificación de gramáticas formales de Chomsky [3] .

Estos campos estudian modelos computacionales (autómatas) y formas de describir y clasificar lenguajes formales . en la década de 1940 Warren McCulloch y Walter Pitts describieron un sistema neuronal usando un autómata simple como modelo para una neurona .

El matemático Stephen Kleene describió más tarde estos patrones usando su notación matemática llamada " conjuntos regulares ".

Ken Thompson los incorporó al editor QED y luego al editor UNIX ed . Desde entonces, las expresiones regulares se han vuelto ampliamente utilizadas en UNIX y utilidades similares a UNIX como expr , awk , Emacs , vi , lex y Perl .

Las expresiones regulares en Perl y Tcl provienen de una implementación escrita por Henry Spencer . Philip Hazel desarrolló la biblioteca PCRE ( expresiones regulares compatibles con Perl )   , que se utiliza en muchas herramientas modernas como PHP y Apache . .

En la teoría de los lenguajes formales

Las expresiones regulares constan de constantes y operadores que definen conjuntos de cadenas y conjuntos de operaciones sobre ellas, respectivamente. Se definen las siguientes constantes:

y las siguientes operaciones:

Las expresiones regulares que se encuentran en los lenguajes de programación modernos (particularmente PCRE ) tienen más poder que las llamadas expresiones regulares en la teoría del lenguaje formal; en particular, tienen referencias anteriores numeradas . Esto les permite analizar cadenas descritas no solo por gramáticas regulares, sino también por gramáticas más complejas, en particular gramáticas libres de contexto [5] [6] .

Sintaxis

Representación de símbolos

Caracteres regulares ( literales ) y caracteres especiales ( metacaracteres )

La mayoría de los caracteres en una expresión regular se representan a sí mismos, con la excepción de los caracteres especiales [ ] \ / ^ $ . | ? * + ( ) { } (este conjunto difiere para los diferentes tipos de expresiones regulares, consulte Variedades de expresiones regulares ), que se pueden escapar con un carácter \(barra invertida) para representarse a sí mismos como caracteres de texto. Puede escapar una secuencia completa de caracteres encerrándola entre \Qy \E.

Ejemplo Conformidad
a\.? a.oa
a\\\\b a\\b
a\[F\] a[F]
\Q+-*/\E +-*/

Otros caracteres especiales se pueden representar de manera similar (los conjuntos de caracteres que requieren escape pueden variar según la implementación específica). Parte de los caracteres que en una implementación u otra no requieren escape (por ejemplo, corchetes angulares < >) pueden escaparse por razones de legibilidad.

Cualquier caracter

El metacarácter .(punto) significa cualquier carácter individual, pero en algunas implementaciones excluye el carácter de nueva línea.

En lugar de un carácter ., puede usar [\s\S](todos los espacios en blanco y los caracteres que no son espacios en blanco, incluido el carácter de nueva línea).

Clases de caracteres (conjuntos de caracteres)

El conjunto de caracteres entre corchetes [ ]se denomina clase de caracteres y le permite indicar al intérprete de expresiones regulares que uno de los caracteres enumerados puede aparecer en un lugar determinado de una cadena. En particular, [абв]establece la posibilidad de ocurrencia en el texto de uno de los tres caracteres especificados y [1234567890]establece la correspondencia con uno de los dígitos. Es posible especificar rangos de caracteres: por ejemplo, [А-Яа-я]coincide con todas las letras del alfabeto ruso, excepto las letras "Ё" y "ё" [7] . Algunas implementaciones de expresiones regulares pueden permitir que las clases de caracteres incluyan no solo caracteres, sino también cadenas completas. [ocho]

Si desea especificar caracteres que no están incluidos en el conjunto especificado, utilice el carácter ^entre corchetes, por ejemplo, [^0-9]significa cualquier carácter que no sea un número.

Agregar caracteres especiales al conjunto mediante escape es la forma más sencilla. Sin embargo, las expresiones regulares modernas también heredan el enfoque tradicional; consulte Expresiones regulares tradicionales .

Algunas clases de caracteres se pueden reemplazar con metacaracteres especiales:

Símbolo Posible equivalente [9] Conformidad
\d [0-9] Цифровой символ
\D [^0-9] Нецифровой символ
\s [ \f\n\r\t\v] Пробельный символ
\S [^ \f\n\r\t\v] Непробельный символ

Пример: Выражение вида ^\S.* или ^[^ \f\n\r\t\v].* будет находить строки, начинающиеся с непробельного символа

\w[10] [A-Za-z0-9_] Буквенный или цифровой символ или знак подчёркивания; буквы ограничены латиницей

Пример: Выражение вида \w+ будет находить и выделять отдельные слова

\W[11] [^A-Za-z0-9_] Любой символ, кроме буквенного или цифрового символа или знака подчёркивания

Posición dentro de una cadena

Los siguientes caracteres le permiten colocar la expresión regular en relación con los elementos de texto: el principio y el final de una línea, los límites de las palabras.

Actuación Posición Ejemplo Conformidad
^ Comienzo del texto (o línea con el modificador ?m) ^a aaa aaa
$ Fin del texto (o línea con el modificador ?m) a$ aaa aaa
\b borde de palabra a\b aaa aaa
\ba aaa aaa
\B No es un límite de palabra \Ba\B aaa aaa
\G Búsqueda exitosa anterior \Ga aaa aaa(la búsqueda se detuvo en la cuarta posición, donde no se encontró a)

Caracteres especiales

\n - avance de línea

\r - retorno de carro

Designación de grupo

Los paréntesis se utilizan para definir el alcance y la precedencia de las operaciones . Un patrón dentro de un grupo se procesa como un todo y se puede cuantificar. Por ejemplo, la expresión (тр[ау]м-?)*encontrará una secuencia de la forma трам-трам-трумтрам-трум-трамтрум.

Enumeración

Una barra vertical separa las opciones válidas. Por ejemplo, gray|greycoincidencias grayo grey. Cabe recordar que la enumeración de opciones se realiza de izquierda a derecha, tal y como se indican.

Si desea especificar una lista de opciones dentro de una expresión regular más compleja, debe encerrarse en un grupo. Por ejemplo, gray|greyo gr(a|e)ydescribe una cadena grayo grey. En el caso de alternativas de un solo carácter, se prefiere la opción gr[ae]y, ya que la comparación con una clase de carácter es más fácil que procesar un grupo con una verificación de todos sus posibles modificadores y generar comentarios.

Cuantificación (búsqueda de secuencias)

El cuantificador después de un carácter, clase de carácter o grupo determina cuántas veces puede aparecer la expresión anterior. Tenga en cuenta que un cuantificador puede hacer referencia a más de un carácter en una expresión regular solo si se trata de una clase o grupo de caracteres.

Actuación Número de repeticiones Equivalente Ejemplo Conformidad
? cero o uno {0,1} colou?r color,colour
* cero o más {0,} colou*r color, colour, colouur etc
+ Uno o mas {1,} colou+r colour, colouur etc. (pero no color)
Actuación Número de repeticiones Ejemplo Conformidad
{n} exactamente n veces colou{3}r colouuur
{m,n} De m a n inclusive colou{2,4}r colouur. colouuur.colouuuur
{m,} no menos de m colou{2,}r colouur, colouuur, colouuuur etc
{,n} no más que n colou{,3}r color. colour. colouur.colouuur

Una secuencia se usa .*a menudo para indicar cualquier número de caracteres entre dos partes de una expresión regular.

Las clases de caracteres en combinación con los cuantificadores le permiten hacer coincidir con textos reales. Por ejemplo, columnas de números, números de teléfono, direcciones postales, elementos de marcado HTML , etc.

Si los caracteres { } no forman un cuantificador, se ignora su significado especial.

Cuantificación codiciosa y perezosa Un ejemplo del uso de expresiones codiciosas y perezosas.

La expresión (<.*>)coincide con una cadena que contiene varias etiquetas de marcado HTML en su totalidad.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Para resaltar etiquetas individuales, puede aplicar una versión diferida de esta expresión: (<.*?>) no corresponde a la línea completa que se muestra arriba, sino a etiquetas individuales (resaltadas en color):

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

En algunas implementaciones, los cuantificadores en las expresiones regulares corresponden a la cadena más larga posible (los cuantificadores son codiciosos , en inglés  greedy ). Esto puede ser un problema importante. Por ejemplo, a menudo se espera que una expresión encuentre etiquetas HTML(<.*>) en el texto . Sin embargo, si hay más de una etiqueta HTML en el texto, toda la línea que contiene varias etiquetas coincide con la expresión.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Este problema se puede resolver de dos maneras.

  1. Considere caracteres que no coincidan con el patrón deseado ( <[^>]*>para el caso anterior).
  2. Defina un cuantificador como no codicioso ( perezoso , inglés  perezoso ): la mayoría de las implementaciones le permiten hacer esto agregando un signo de interrogación después.

El uso de cuantificadores perezosos puede conducir al problema inverso cuando una expresión coincide demasiado corta, en particular la cadena vacía.

Codicioso Perezoso
* *?
+ +?
{n,} {n,}?

También un problema común con las expresiones codiciosas y perezosas son los puntos de retorno para iterar sobre las variantes de una expresión. Los puntos se colocan después de cada iteración del cuantificador. Si el intérprete no encuentra una coincidencia después del cuantificador, comienza a regresar para todos los puntos de ajuste, recalculando la expresión a partir de ahí de una manera diferente.

Cuantificación celosa (supercodiciosa)

Al buscar una expresión en una cadena, el intérprete irá aproximadamente por el siguiente camino: (a+a+)+a aaaaa

  1. aaaaa
  2. aaaa
  3. aaaaa
  4. aaa
  5. aaaaa
  6. aaaa
  7. aaaaa- y solo entonces, después de verificar todos los puntos de retorno, se detendrá.

Al usar un cuantificador celoso, solo se ejecutará el primer paso del algoritmo.

A diferencia de la cuantificación regular (codiciosa), la cuantificación celosa (posesiva) no solo intenta encontrar la opción más larga, sino que tampoco permite que el algoritmo regrese a los pasos de búsqueda anteriores para encontrar posibles coincidencias para el resto de la expresión regular.

El uso de cuantificadores celosos aumenta la velocidad de búsqueda, especialmente en los casos en que la cadena no coincide con la expresión regular. Además, los cuantificadores celosos se pueden usar para eliminar coincidencias no deseadas.

Codicioso Celoso
* *+
? ?+
+ ++
{n,} {n,}+
Ejemplo Conformidad
ab(xa)*+a abxaabxaa; pero no , ya que la carta ya esta tomada abxaabxaaa

Esto es análogo a la agrupación atómica .

Agrupación

Comentarios

Un uso de la agrupación es reutilizar grupos de caracteres encontrados previamente ( subcadenas , bloques , subexpresiones marcadas , capturas ). Al procesar la expresión, las subcadenas encontradas por el patrón dentro del grupo se almacenan en un área de memoria separada y reciben un número a partir de uno. Cada subcadena coincide con un par de corchetes en la expresión regular. La cuantificación de grupo no afecta el resultado guardado, es decir, solo se guarda la primera aparición. Por lo general, se admiten hasta 9 subcadenas numeradas, numeradas del 1 al 9, pero algunos intérpretes le permiten trabajar con más. Posteriormente, dentro de esta expresión regular, la notación from \1to puede usarse \9para buscar una coincidencia con una subcadena encontrada previamente.

Por ejemplo, la expresión regular (та|ту)-\1coincidirá con la cadena та-таo ту-ту, pero omitirá la cadena та-ту.

Además, las subcadenas encontradas anteriormente se pueden usar cuando se reemplazan por expresiones regulares. En este caso, se insertan los mismos símbolos en el texto de reemplazo que dentro de la propia expresión.

Agrupación sin retroalimentación

Si el grupo se usa solo para agrupar y su resultado no se necesita más adelante, puede usar la agrupación del tipo . No se asigna un área de memoria separada para el resultado de dicha agrupación y, en consecuencia, no se le asigna un número. Esto tiene un efecto positivo en la velocidad de ejecución de la expresión, pero reduce la legibilidad. (?:шаблон)

Agrupación atómica

Una agrupación atómica de una vista , como una agrupación sin retroalimentación, no crea retroalimentación. Por el contrario, dicha agrupación prohíbe volver atrás en la cadena si ya se ha encontrado parte del patrón. (?>шаблон)

Ejemplo Conformidad Grupos creados
a(bc|b|x)cc abccaxcc

abccaxcc

abccaxcc

abccaxcc

a(?:bc|b|x)cc abccaxcc,abccaxcc No
a(?>bc|b|x)cc abccaxcc

pero no abccaxcc: variante xencontrada, otras ignoradas

No
a(?>x*)xa no encontrado axxxa: todos están xocupados y no hay retorno dentro del grupo

La agrupación atómica es incluso más rápida que la agrupación de ciclo abierto y ahorra tiempo de CPU mientras se ejecuta el resto de la expresión, ya que evita que se verifiquen otras opciones dentro del grupo cuando ya se ha encontrado una opción. Esto es muy útil cuando se optimizan grupos con muchas opciones diferentes.

Esto es análogo a la cuantificación celosa .

Modificadores

Los modificadores son válidos desde el momento en que ocurren hasta el final de la expresión regular o el modificador opuesto. Algunos intérpretes pueden aplicar el modificador a toda la expresión, en lugar de desde el momento en que ocurre.

Sintaxis Descripción
(?i) Incluye insensibilidad a mayúsculas y minúsculas _  _
(?-i) Apaga
(?s) Incluye modo de coincidencia de puntos para caracteres de salto de línea y retorno de carro
(?-s) Apaga
(?m) Símbolos ^y $solo causan una coincidencia después y antes de los caracteres de nueva línea
(?-m) con principio y final de texto
(?x) Incluye modo sin tener en cuenta los espacios entre partes de la expresión regular y le permite usar #para comentarios
(?-x) Apaga

Los grupos de modificadores se pueden combinar en un solo grupo: (?i-sm). Dicho grupo activa y desactiva el modo y los imodos . Si se requiere el uso de modificadores solo dentro de un grupo, entonces el patrón deseado se indica dentro del grupo después de los modificadores y después de los dos puntos. Por ejemplo, encontrará pero no . sm(?-i)(?i:tv)setTVsetTVSET

Comentarios

Para agregar comentarios a una expresión regular, puede usar grupos de comentarios del formulario . Tal grupo es completamente ignorado por el intérprete y no se verifica si aparece en el texto. Por ejemplo, la expresión coincide con la cadena . (?#комментарий)А(?#тут комментарий)БАБ

Mirar hacia adelante y hacia atrás

La mayoría de las implementaciones de expresiones regulares tienen una forma de buscar un fragmento de texto "revisando" (pero sin incluir) el texto circundante que viene antes o después del fragmento de texto que se busca. La búsqueda negativa se usa con menos frecuencia y "se asegura" de que las coincidencias especificadas, por el contrario, no ocurran antes o después del fragmento de texto buscado.

Actuación Ver tipo Ejemplo Conformidad
(?=шаблон) mirada positiva hacia el futuro Людовик(?=XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?!шаблон) Mirada negativa hacia adelante (con negación) Людовик(?!XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?<=шаблон) Mirada positiva hacia atrás (?<=Сергей )Иванов Сергей Иванов, Игорь Иванов
(?<!шаблон) Retrospectiva negativa (con negación) (?<!Сергей )Иванов Сергей Иванов, Игорь Иванов

Buscar por condición

En muchas implementaciones de expresiones regulares, es posible elegir qué ruta tomará la verificación en un lugar u otro en la expresión regular, en función de los valores ya encontrados.

Actuación Explicación Ejemplo Conformidad
(?(?=если)то|иначе) Si la operación de escaneo tiene éxito, se ejecuta la siguiente parte то; de ​​lo contrario, se ejecuta la parte иначе. Cualquiera de las cuatro operaciones de búsqueda se puede utilizar en una expresión. Tenga en cuenta que la operación de búsqueda es de ancho cero, por lo que las partes тоen caso de una búsqueda positiva o иначеnegativa deben incluir la descripción de la plantilla de la operación de búsqueda. (?(?<=а)м|п) мам,пап
(?(n)то|иначе) Si el n -ésimo grupo devolvió un valor, entonces la búsqueda por condición la realiza el patrón то, de lo contrario, el patrón иначе. (а)?(?(1)м|п) мам,пап

Banderas

En algunos lenguajes (por ejemplo, en JavaScript ) los llamados. "banderas" que amplían la funcionalidad de RegExp. Las banderas se especifican después de la expresión regular (no importa el orden de las banderas). Banderas típicas:

  • g  - búsqueda global (se procesan todas las coincidencias con el patrón de búsqueda);
  • i  - mayúsculas y minúsculas no importa;
  • m  - búsqueda multilínea;
  • s  : el texto se trata como una línea, en este caso, el metacarácter .(punto) coincide con cualquier carácter individual, incluido el carácter de nueva línea;
  • u  - interpretación unicode. La expresión puede contener patrones especiales específicos de Unicode, como /\p{Lu}/ letras mayúsculas.

La bandera se especifica después del patrón, por ejemplo, así: . /[0-9]$/m

Variedades de expresiones regulares

Expresiones regulares POSIX básicas

( Expresiones regulares básicas en inglés  (BRE)). Expresiones regulares tradicionales de UNIX . La sintaxis básica de expresiones regulares ahora está obsoleta para POSIX , pero todavía se usa ampliamente por razones de compatibilidad con versiones anteriores. Muchas utilidades de UNIX utilizan expresiones regulares de este tipo de forma predeterminada.

Esta versión incluye metacaracteres:

  • .;
  • [ ];
  • [^ ];
  • ^(válido solo al comienzo de una expresión);
  • $(válido solo al final de la expresión);
  • *;
  • \{ \} - versión inicial para { };
  • \( \) - versión inicial para ( );
  • \n, donde n  es un número del 1 al 9.

Peculiaridades:

  • El asterisco debe ir después de la expresión que coincida con el carácter único. Ejemplo: [xyz]*.
  • La expresión debe considerarse inválida. En algunos casos, coincide con cero o más repeticiones de la cadena . En otros, coincide con la cadena .\(блок\)*блокблок*
  • Dentro de una clase de caracteres, los valores de caracteres especiales generalmente se ignoran. Casos especiales:
    • Para agregar un personaje ^a un conjunto, no debe colocarse allí primero.
    • Para agregar un personaje -a un conjunto, debe colocarse allí primero o último. Por ejemplo:
      • Plantilla de nombre DNS, que puede incluir letras, números, menos y punto delimitador: [-0-9a-zA-Z.];
      • cualquier carácter excepto menos y número: [^-0-9].
    • Para agregar un símbolo [o ]un conjunto, primero debe colocarse allí. Por ejemplo:
      • [][ab]coincidencias ], o . [_ab

Expresiones regulares POSIX extendidas

( Expresiones regulares extendidas en inglés  (ERE)). La sintaxis es básicamente la misma que la tradicional.

  • Se eliminó el uso de barras invertidas para metacaracteres { }y ( ).
  • Una barra invertida antes de un metacarácter cancela su significado especial (consulte Representación de caracteres especiales ).
  • Se rechaza el diseño teóricamente irregular .\n
  • Se agregaron metacaracteres +, ?, |.

Expresiones regulares compatibles con Perl

Las expresiones regulares compatibles con Perl (PCRE) tienen una sintaxis más rica incluso que POSIX ERE .  Por este motivo, muchas aplicaciones utilizan la sintaxis de expresiones regulares compatible con Perl.

Expresiones regulares compatibles con Unicode

Unicode  es un conjunto de caracteres cuyo propósito es definir todos los caracteres y símbolos de todos los idiomas humanos, vivos y muertos. Por lo tanto, las expresiones regulares diseñadas para muchos idiomas no están vinculadas a conjuntos de caracteres específicos, sino que los describen de acuerdo con reglas aceptadas. Entonces, por ejemplo, una expresión para encontrar letras mayúsculas en cualquier alfabeto se vería así: /\p{Lu}/.

Algunas expresiones regulares son unicode:
actuación funcionalidad
posible forma corta posible forma larga
Letras
\p{L} \p{Letter} cualquier letra en cualquier idioma
\p{Ll} \p{Lowercase_Letter} letras minúsculas (minúsculas) de las que tienen una ortografía mayúscula
\p{Lu} \p{Uppercase_Letter} letras mayúsculas (mayúsculas) para aquellos con una ortografía en minúsculas
\p{Lt} \p{Titlecase_Letter} una letra mayúscula que aparece al principio de una palabra minúscula
\p{L&} \p{Cased_Letter} una letra que se escribe tanto en mayúsculas como en minúsculas
\p{Lm} \p{Modifier_Letter} caracteres especiales que se utilizan como letras
\p{Lo} \p{Other_Letter} un carácter o ideograma que no tiene ortografía mayúscula o minúscula
Símbolos especiales
\p{M} \p{Mark} caracteres insertados para combinar con otros caracteres (por ejemplo, acentos, diéresis, corchetes envolventes)
\p{Mn} \p{Non_Spacing_Mark} un carácter insertado para combinarse con otros caracteres sin ocupar un ancho adicional
\p{Mc} \p{Spacing_Combining_Mark} caracteres insertados para combinarse con otros caracteres, ocupando un ancho adicional (como en muchos idiomas orientales)
\p{Me} \p{Enclosing_Mark} caracteres que envuelven un carácter. Por ejemplo círculo, cuadrado, etc.
Espacios y separadores
\p{Z} \p{Separator} cualquier tipo de espacios o separadores invisibles
\p{Zs} \p{Space_Separator} caracteres de espacio en blanco que son invisibles pero tienen un ancho
\p{Zl} \p{Line_Separator} símbolo de separación de línea U+2028
\p{Zp} \p{Paragraph_Separator} signo de párrafo U+2029
símbolos matemáticos
\p{S} \p{Symbol} símbolos matemáticos, símbolos de moneda, símbolos pseudográficos (marcos), etc.
\p{Sm} \p{Math_Symbol} cualquier símbolo matemático
\p{Sc} \p{Currency_Symbol} cualquier símbolo de moneda
\p{Sk} \p{Modifier_Symbol} carácter combinado (marca) como una combinación del propio carácter y el carácter de la marca
\p{So} \p{Other_Symbol} varios símbolos, símbolos no matemáticos, no monetarios, o combinaciones de los mismos
Caracteres numéricos
\p{N} \p{Number} cualquier tipo de caracteres digitales en cualquier idioma
\p{Nd} \p{Decimal_Digit_Number} números del cero al nueve en cualquier idioma
\p{Nl} \p{Letter_Number} un número que puede parecer letras, como los números romanos
\p{No} \p{Other_Number} un número representado como un superíndice o subíndice, o un número que no consta de dígitos (excluyendo los números de las escrituras ideográficas)
Signos de puntuación
\p{P} \p{Punctuation} cualquier tipo de signos de puntuación
\p{Pd} \p{Dash_Punctuation} cualquier tipo de guion o raya
\p{Ps} \p{Open_Punctuation} cualquier tipo de soportes de apertura
\p{Pe} \p{Close_Punctuation} cualquier tipo de paréntesis de cierre
\p{Pi} \p{Initial_Punctuation} cualquier tipo de comillas de apertura
\p{Pf} \p{Final_Punctuation} cualquier tipo de comillas de cierre
\p{Pc} \p{Connector_Punctuation} caracteres de puntuación, como guiones bajos o compuestos de palabras
\p{Po} \p{Other_Punctuation} cualquier tipo de caracteres de puntuación que no sean puntos, corchetes, comillas o conectores
Personajes de control
\p{C} \p{Other} caracteres de control invisibles y posiciones no utilizadas
\p{Cc} \p{Control} Caracteres de control ASCII o Latin-1: 0x00-0x1F y 0x7F-0x9F
\p{Cf} \p{Format} indicadores de formato invisibles
\p{Co} \p{Private_Use} cualquier posición reservada para uso personal
\p{Cs} \p{Surrogate} la mitad de los pares sustitutos codificados en UTF-16
\p{Cn} \p{Unassigned} cualquier posición que no tenga símbolos asignados

Expresiones regulares difusas

En algunos casos, es conveniente usar expresiones regulares para analizar fragmentos de texto en lenguaje natural , es decir, escritos por personas, y que posiblemente contengan errores tipográficos o usos de palabras no estándar. Por ejemplo, si realiza una encuesta (digamos, en un sitio web) "qué estación de metro usa", puede resultar que los visitantes puedan indicar "Nevsky Prospekt" como:

  • nevski
  • Nevsk. Cra
  • Nuevo avenida
  • Emb. Canal Griboyedov ("Canal Griboedov" es el nombre de la segunda salida de la estación de metro Nevsky Prospekt)

Aquí, las expresiones regulares habituales no son aplicables, principalmente debido a que las palabras incluidas en los patrones pueden no coincidir con mucha precisión (fuzzy), pero, sin embargo, sería conveniente describir las dependencias estructurales entre los elementos del patrón. con expresiones regulares, por ejemplo, en nuestro caso indicar que la coincidencia puede ser con la muestra "Nevsky Prospekt" O "Griboedov Canal", además, "Prospect" puede abreviarse como "pr" o ausente, y la abreviatura "Eb. " puede colocarse antes de "Canal".

Esta tarea es similar a la búsqueda de texto completo , diferenciándose en que aquí se debe comparar un fragmento corto con un conjunto de patrones, y en la búsqueda de texto completo, por el contrario, el patrón suele ser uno, mientras que el fragmento de texto es muy grande. , o el problema de la desambiguación léxica , que, sin embargo, no permite especificar relaciones estructurantes entre elementos del patrón.

Hay una pequeña cantidad de bibliotecas que implementan el mecanismo de expresión regular con la posibilidad de comparación aproximada:

  • TRE es una biblioteca C gratuita que utiliza una sintaxis de expresión regular similar a POSIX (proyecto estable);
  • FREJ es una biblioteca Java de código abierto que utiliza una sintaxis en forma de Lisp y carece de muchas de las características de las expresiones regulares convencionales, pero se enfoca en varios tipos de reemplazos automáticos de fragmentos de texto (versión beta).

Implementaciones

  • NFA ( autómatas  de estado finito no deterministas  - autómatas finitos no deterministas ) utiliza un algoritmo de retroceso codicioso , verificando todas las expansiones posibles de una expresión regular en un orden determinado y eligiendo el primer valor adecuado. NFA puede manejar subexpresiones y referencias inversas. Pero debido al algoritmo de reversión, la NFA tradicional puede verificar el mismo lugar varias veces, lo que afecta negativamente la velocidad del trabajo. Dado que NFA tradicional toma la primera coincidencia que encuentra, es posible que no encuentre la coincidencia más larga (esto es requerido por el estándar POSIX , y hay modificaciones de NFA que cumplen con este requisito: GNU sed ). Es este mecanismo de expresiones regulares el que se utiliza, por ejemplo, en Perl , Tcl y .NET .
  • DFA ( eng.  deterministic finite-state automata  - deterministic finite automata ) funciona de forma lineal en el tiempo, porque no utiliza reversiones y nunca verifica dos veces ninguna parte del texto. Se puede garantizar que encontrarán la cadena más larga posible. Un DFA contiene solo un estado final, por lo que no maneja referencias anteriores y tampoco admite construcciones de extensión explícitas, lo que significa que tampoco puede manejar subexpresiones. DFA se usa en lex y egrep, por ejemplo .

Véase también

Notas

  1. docs.oracle.com . Consultado el 20 de agosto de 2013. Archivado desde el original el 9 de septiembre de 2013.
  2. MSDN . Consultado el 11 de julio de 2011. Archivado desde el original el 15 de septiembre de 2012.
  3. Aho A., Ulman J. Teoría del análisis, traducción y compilación. Análisis sintáctico. - Mundo. - M. , 1978. - T. 2.
  4. Muchos libros usan ∪, + o ∨ en lugar de |.
  5. Nikita Popov. El verdadero poder de las expresiones regulares (15 de junio de 2012). Consultado el 30 de mayo de 2019. Archivado desde el original el 16 de mayo de 2019. Traducción: El verdadero poder de las expresiones regulares Archivado el 30 de mayo de 2019 en Wayback Machine .
  6. Vladímir Komendantsky. Problema de coincidencia para expresiones regulares con variables // Tendencias en la programación funcional: 13º Simposio internacional, TFP 2012, St Andrews, Reino Unido, 12-14 de junio de 2012, artículos seleccionados revisados. — Springer, 2013. — Pág. 149–150. — ISBN 9783642404474 .
  7. Para usar secuencias de letras, debe configurar la página de códigos correcta, en la que estas secuencias irán en orden desde y hacia los caracteres especificados. Para el idioma ruso, estos son Windows-1251 , ISO 8859-5 y Unicode , ya que en DOS-855 , DOS-866 y KOI8-R las letras rusas no van en un grupo completo o no están ordenadas alfabéticamente. Se debe prestar especial atención a las letras con signos diacríticos , como el ruso Ё/ё, que suelen estar dispersos fuera de los rangos de caracteres principales.
  8. UTS #18:  Expresiones regulares Unicode . Consultado el 8 de agosto de 2021. Archivado desde el original el 8 de agosto de 2021.
  9. Varía según la implementación del motor de expresiones regulares
  10. Hay una notación equivalente [[:palabra:]]
  11. Hay una notación equivalente [^[:palabra:]]

Literatura

  • Friedl, J. Expresiones regulares = Dominio de las expresiones regulares. - San Petersburgo. : "Pedro" , 2001. - 352 p. — (Biblioteca del programador). — ISBN 5-318-00056-8 .
  • Smith, Bill. Métodos y algoritmos para computar en cadenas (regexp) = Patrones de computación en cadenas. - M. : "Williams" , 2006. - 496 p. — ISBN 0-201-39839-7 .
  • Forta, Ben. Aprende tus propias expresiones regulares. 10 minutos por lección = Sams Teach Yourself Regular Expressions in 10 Minutes. - M. : "Williams" , 2005. - 184 p. — ISBN 5-8459-0713-6 .
  • Jan Goyverts, Steven Levitan. Expresiones regulares. Libro de cocina = Expresiones regulares: Libro de cocina. - San Petersburgo. : "Símbolo-Plus" , 2010. - 608 p. - ISBN 978-5-93286-181-3 .
  • Melnikov SV Perl para programadores profesionales. Expresiones regulares. - M. : "Binom" , 2007. - 190 p. — (Fundamentos de la Tecnología de la Información). — ISBN 978-5-94774-797-3 .
  • Michael Fitzgerald. Expresiones regulares. Lo esencial. - M. : "Williams" , 2015. - 144 p. — ISBN 978-5-8459-1953-3 .

Enlaces