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.
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.
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 . .
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] .
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 caracterEl 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_] | Любой символ, кроме буквенного или цифрового символа или знака подчёркивания |
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) |
\n - avance de línea
\r - retorno de carro
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 трам-трам-трумтрам-трум-трамтрум.
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.
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.
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
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 .
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ónSi 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ómicaUna 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 .
ModificadoresLos 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
ComentariosPara 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 . (?#комментарий)А(?#тут комментарий)БАБ
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) | (?<!Сергей )Иванов | Сергей Иванов, Игорь Иванов |
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)м|п) | мам,пап |
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:
La bandera se especifica después del patrón, por ejemplo, así: . /[0-9]$/m
( 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:
Peculiaridades:
( Expresiones regulares extendidas en inglés (ERE)). La sintaxis es básicamente la misma que la tradicional.
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.
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}/.
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 |
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:
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:
Lenguajes formales y gramáticas formales | |
---|---|
Conceptos generales | |
tipo 0 | |
Tipo 1 |
|
Tipo 2 | |
tipo 3 |
|
analizando |