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:
- RegExr (para JavaScript)
- Perl: YAPE: Regex Explica
- Regex Coach (motor respaldado por CL-PPCRE )
- RegexPal (para JavaScript)
- Expresiones regulares en línea probador
- Regex Buddy
- Regex 101 (para PCRE, JavaScript, Python, Golang)
- Visual RegExp
- Expresso (para .NET)
- Rubular (para Ruby)
- Biblioteca de expresiones regulares (expresiones regulares predefinidas para escenarios comunes)
- Txt2RE
- Regex Tester (para JavaScript)
- Regex Storm (para .NET)
- Debuggex (probador y ayudante visual de Debuggex regulares)
Libros
- Dominar las expresiones regulares , la 2ª edición y la 3ª edición .
- Hoja de trucos de expresiones regulares
- Libro de cocina Regex
- Enséñese expresiones regulares
Recursos gratuitos
- RegexOne - Aprende con ejercicios simples e interactivos.
- Expresiones regulares - Todo lo que debes saber (Serie PDF)
- Resumen de sintaxis de Regex
- Cómo funcionan los regexes
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.