test solo regulares regular online numeros google expresiones examples alfanumerico regex

regex - solo - regular expression c# examples



Aprendizaje de expresiones regulares (1)

Realmente no entiendo las expresiones regulares. ¿Puedes explicármelos de una manera fácil de seguir? Si hay herramientas o libros en línea, ¿podría también vincularlos?


La parte más importante son los conceptos. Una vez que entienda cómo funcionan los componentes básicos, las diferencias en la sintaxis ascienden a poco más que los dialectos suaves. Una capa encima de la sintaxis de su motor de expresión regular es la sintaxis del lenguaje de programación que está utilizando. Los lenguajes como Perl eliminan la mayor parte de esta complicación, pero tendrá que tener en cuenta otras consideraciones si usa expresiones regulares en un programa en C.

Si piensa en las expresiones regulares como bloques de construcción que puede mezclar y combinar como le plazca, le ayuda a aprender a escribir y depurar sus propios patrones, pero también a entender los patrones escritos por otros.

Comience simple

Conceptualmente, las expresiones regulares más simples son los caracteres literales. El patrón N coincide con el carácter ''N''.

Las expresiones regulares una al lado de la otra coinciden con secuencias. Por ejemplo, el patrón de Nick coincide con la secuencia ''N'' seguida de ''i'' seguida de ''c'' seguida de ''k''.

Si alguna vez ha usado grep en Unix, aunque solo sea para buscar cadenas de aspecto normal, ¡ya ha estado usando expresiones regulares! (El re en grep refiere a expresiones regulares.)

Ordenar desde el menú

Añadiendo solo un poco de complejidad, puede hacer coincidir ''Nick'' o ''nick'' con el patrón [Nn]ick . La parte entre corchetes es una clase de caracteres , lo que significa que coincide exactamente con uno de los caracteres incluidos. También puede utilizar rangos en las clases de caracteres, por lo que [ac] coincide con ''a'' o ''b'' o ''c''.

El patrón . es especial: en lugar de hacer coincidir un punto literal solamente, coincide con cualquier carácter . Conceptualmente es lo mismo que la clase de caracteres realmente grande [-.?+%$A-Za-z0-9...] .

Piense en las clases de personajes como menús: elija solo uno.

Atajos útiles

Utilizando . puede ahorrarle mucho escribir, y hay otros atajos para patrones comunes. Digamos que quiere hacer coincidir un dígito: una forma de escribir que es [0-9] . Los dígitos son un objetivo de coincidencia frecuente, por lo que podría utilizar el acceso directo /d . Otros son /s (espacios en blanco) y /w (caracteres de palabras: caracteres alfanuméricos o guiones bajos).

Las variantes en mayúsculas son sus complementos, por lo que /S coincide con cualquier carácter que no sea un espacio en blanco, por ejemplo.

Una vez no es suficiente

A partir de ahí, puedes repetir partes de tu patrón con cuantificadores . Por ejemplo, el patrón ab?c coincide con ''abc'' o ''ac'' porque el ? El cuantificador hace que el subpatrón modifique opcional. Otros cuantificadores son

  • * (cero o más veces)
  • + (una o más veces)
  • {n} (exactamente n veces)
  • {n,} (al menos n veces)
  • {n,m} (al menos n veces, pero no más de m veces)

Al juntar algunos de estos bloques, el patrón [Nn]*ick coincide con todos

  • ick
  • Mella
  • mella
  • Nick
  • nNick
  • nick
  • (y así)

El primer partido demuestra una lección importante: * siempre tiene éxito! Cualquier patrón puede coincidir con cero veces.

Algunos otros ejemplos útiles:

  • [0-9]+ (y su equivalente /d+ ) coincide con cualquier entero no negativo
  • /d{4}-/d{2}-/d{2} coincide con fechas formateadas como 2019-01-01

Agrupamiento

Un cuantificador modifica el patrón a su izquierda inmediata. Podría esperar que 0abc+0 coincida con ''0abc0'', ''0abcabc0'', etc., pero el patrón inmediatamente a la izquierda del cuantificador positivo es c . Esto significa que 0abc+0 coincide con ''0abc0'', ''0abcc0'', ''0abccc0'', y así sucesivamente.

Para hacer coincidir una o más secuencias de ''abc'' con ceros en los extremos, use 0(abc)+0 . Los paréntesis denotan un subpatrón que puede cuantificarse como una unidad. También es común que los motores de expresiones regulares guarden o "capturen" la parte del texto de entrada que coincide con un grupo entre paréntesis. Extraer bits de esta manera es mucho más flexible y menos propenso a errores que contar índices y substr .

Alternancia

Anteriormente, vimos una forma de igualar ''Nick'' o ''nick''. Otro es con alternancia como en Nick|nick . Recuerda que la alternancia incluye todo a su izquierda y todo a su derecha. Utilice paréntesis de agrupación para limitar el alcance de | , por ejemplo , (Nick|nick) .

Para otro ejemplo, podría escribir [ac] equivalente a|b|c , pero es probable que esto no sea óptimo porque muchas implementaciones suponen que las alternativas tendrán longitudes mayores que 1.

Escapando

Aunque algunos personajes coinciden, otros tienen significados especiales. El patrón /d+ no coincide con la barra diagonal inversa seguida de una D minúscula seguida de un signo más: para obtener eso, usaríamos //d/+ . Una barra invertida elimina el significado especial del siguiente carácter.

Codicia

Los cuantificadores de expresiones regulares son codiciosos. Esto significa que coinciden con la mayor cantidad de texto posible al tiempo que permiten que todo el patrón coincida correctamente.

Por ejemplo, digamos que la entrada es

"Hola", dijo ella, "¿cómo estás?"

Podría esperar que ".+" Coincida solo con ''Hola'', y luego se sorprenderá cuando vea que coincide con ''Hola'' hasta el final ''¿usted?''.

Para cambiar de codicioso a lo que usted podría considerar cauteloso, ¿agregue un extra ? al cuantificador. Ahora entiende cómo funciona /((.+?)/) , El ejemplo de su pregunta funciona. Coincide con la secuencia de un paréntesis izquierdo literal, seguido de uno o más caracteres, y termina con un paréntesis derecho.

Si su entrada es ''(123) (456)'', entonces la primera captura será ''123''. Los cuantificadores no codiciosos quieren permitir que el resto del patrón empiece a coincidir lo antes posible.

(En cuanto a su confusión, no conozco ningún dialecto de expresión regular en el que ((.+?)) Haría lo mismo. Sospecho que algo se perdió en la transmisión en algún lugar del camino.

Anclas

Use el patrón especial ^ para hacer coincidir solo al principio de su entrada y $ para hacer coincidir solo al final. Hacer "sujetalibros" con sus patrones donde dice, "Sé lo que hay al frente y atrás, pero dame todo entre" es una técnica útil.

Digamos que quieres hacer coincidir los comentarios del formulario.

-- This is a comment --

escribirías ^--/s+(.+)/s+--$ .

Construye tu propio

Las expresiones regulares son recursivas, por lo que ahora que entiendes estas reglas básicas, puedes combinarlas como quieras.

Herramientas para escribir y depurar expresiones regulares:

Libros

Recursos gratuitos

Nota

†: La afirmación sobre eso . coincidir con cualquier personaje es una simplificación para fines pedagógicos que no es estrictamente cierto. El punto coincide con cualquier carácter excepto en una nueva línea, "/n" , pero en la práctica, rara vez se espera que un patrón como .+ Cruce la frontera de una nueva línea. Las expresiones regulares de Perl tienen un Pattern.DOTALL /s y Java Pattern.DOTALL , por ejemplo, para hacer . coincide con cualquier personaje en absoluto. Para los idiomas que no tienen tal característica, puedes usar algo como [/s/S] para que coincida con "cualquier espacio en blanco o cualquier espacio en blanco", en otras palabras, cualquier cosa.