in

regex – ¿Qué es un grupo que no captura en expresiones regulares?

apple touch icon@2

Permítanme intentar explicar esto con un ejemplo.

Considere el siguiente texto:

http://stackoverflow.com/
https://stackoverflow.com/questions/tagged/regex

Ahora, si aplico la expresión regular a continuación sobre ella …

(https?|ftp)://([^/rn]+)(/[^rn]*)?

… obtendría el siguiente resultado:

Match "http://stackoverflow.com/"
     Group 1: "http"
     Group 2: "stackoverflow.com"
     Group 3: "http://stackoverflow.com/"

Match "https://stackoverflow.com/questions/tagged/regex"
     Group 1: "https"
     Group 2: "stackoverflow.com"
     Group 3: "http://stackoverflow.com/questions/tagged/regex"

Pero no me importa el protocolo, solo quiero el host y la ruta de la URL. Entonces, cambio la expresión regular para incluir el grupo que no captura (?:).

(?:https?|ftp)://([^/rn]+)(/[^rn]*)?

Ahora, mi resultado se ve así:

Match "http://stackoverflow.com/"
     Group 1: "stackoverflow.com"
     Group 2: "http://stackoverflow.com/"

Match "https://stackoverflow.com/questions/tagged/regex"
     Group 1: "stackoverflow.com"
     Group 2: "http://stackoverflow.com/questions/tagged/regex"

¿Ver? El primer grupo no ha sido capturado. El analizador lo usa para hacer coincidir el texto, pero lo ignora más tarde, en el resultado final.


EDITAR:

Como se solicitó, permítanme intentar explicar los grupos también.

Bueno, los grupos sirven para muchos propósitos. Pueden ayudarlo a extraer información exacta de una coincidencia más grande (que también se puede nombrar), le permiten volver a emparejar un grupo emparejado anterior y se pueden usar para sustituciones. Probemos algunos ejemplos, ¿de acuerdo?

Imagine que tiene algún tipo de XML o HTML (tenga en cuenta que es posible que las expresiones regulares no sean la mejor herramienta para el trabajo, pero es un buen ejemplo). Desea analizar las etiquetas, por lo que podría hacer algo como esto (he agregado espacios para que sea más fácil de entender):

   <(?<TAG>.+?)> [^<]*? </k<TAG>>
or
   <(.+?)> [^<]*? </1>

La primera expresión regular tiene un grupo con nombre (TAG), mientras que la segunda usa un grupo común. Ambas expresiones regulares hacen lo mismo: usan el valor del primer grupo (el nombre de la etiqueta) para que coincida con la etiqueta de cierre. La diferencia es que el primero usa el nombre para que coincida con el valor, y el segundo usa el índice de grupo (que comienza en 1).

Probemos algunas sustituciones ahora. Considere el siguiente texto:

Lorem ipsum dolor sit amet consectetuer feugiat fames malesuada pretium egestas.

Ahora, usemos esta tonta expresión regular sobre ella:

b(S)(S)(S)(S*)b

Esta expresión regular coincide con palabras con al menos 3 caracteres y usa grupos para separar las primeras tres letras. El resultado es este:

Match "Lorem"
     Group 1: "L"
     Group 2: "o"
     Group 3: "r"
     Group 4: "em"
Match "ipsum"
     Group 1: "i"
     Group 2: "p"
     Group 3: "s"
     Group 4: "um"
...

Match "consectetuer"
     Group 1: "c"
     Group 2: "o"
     Group 3: "n"
     Group 4: "sectetuer"
...

Entonces, si aplicamos la cadena de sustitución:

$1_$3$2_$4

… sobre él, estamos tratando de usar el primer grupo, agregar un guión bajo, usar el tercer grupo, luego el segundo grupo, agregar otro guión bajo y luego el cuarto grupo. La cadena resultante sería como la siguiente.

L_ro_em i_sp_um d_lo_or s_ti_ a_em_t c_no_sectetuer f_ue_giat f_ma_es m_la_esuada p_er_tium e_eg_stas.

También puede usar grupos con nombre para sustituciones, usando ${name}.

Para jugar con las expresiones regulares, recomiendo http://regex101.com/, que ofrece una buena cantidad de detalles sobre cómo funciona la expresión regular; también ofrece algunos motores de expresiones regulares para elegir.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

JSON: esquema

pr29urTfbtgmep3vbXcogQ 1200 80

Ubicaciones de GTA Online Antennas | GamesRadar +