Propósito de {1} en esta expresión regular para hacer coincidir los protocolos de URL

StackOverflow https://stackoverflow.com/questions/13470

  •  08-06-2019
  •  | 
  •  

Pregunta

estaba leyendo esta pregunta sobre cómo analizar URL de páginas web y tenía una pregunta sobre la respuesta aceptada que ofreció esta solución:

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

La solución fue ofrecida por csmba y se lo acreditó a regexlib.com.Uf.Créditos hechos.

Creo que esta es una expresión regular bastante ingenua, pero es un buen punto de partida para construir algo mejor.Pero mi pregunta es esta:

¿Cuál es el punto de {1}?Significa "exactamente uno del grupo anterior", ¿verdad?¿No es ese el comportamiento predeterminado de una agrupación en una expresión regular?¿Se cambiaría la expresión de alguna manera si el {1} ¿fueron eliminados?

Si viera esto de un compañero de trabajo, señalaría su error, pero mientras escribo esto, la respuesta tiene una calificación de 6 y la expresión en regexlib.com tiene una calificación de 4 de 5.¿Entonces tal vez me estoy perdiendo algo?

¿Fue útil?

Solución

@Jeff Atwood, tu interpretación está un poco equivocada - {1} significa coincidir exactamente una vez, pero no tiene ningún efecto en la "captura" - la captura se produce debido a los pares - las llaves solo especifican el número de veces que debe coincidir el patrón la fuente, una vez, como usted dice.

Estoy de acuerdo con @Marius, incluso si su respuesta es un poco concisa y puede parecer frívola.Las expresiones regulares son difíciles, si uno no está acostumbrado a usarlas, y el {1} ​​en la pregunta no es del todo un error; en los sistemas que lo admiten, significa "exactamente una coincidencia".En este sentido, realmente no hace nada.

Desafortunadamente, a diferencia de una publicación ahora eliminada, no impide que la expresión regular coincida. http://http://example.org, ya que \S+ al final coincidirá con uno o más caracteres que no sean espacios en blanco, incluido el http://example.org en http://http://example.org (verificado usando Python 2.5, en caso de que mi lectura de expresiones regulares estuviera apagada).Entonces, la expresión regular dada no es realmente la mejor.No soy un experto en URL, pero probablemente sería necesario (pero no suficiente) algo que limite la aparición de ":" y "//" después del primero para garantizar buenas URL.

Otros consejos

@Robar:No estoy de acuerdo.Para hacer cumplir lo que está pidiendo, creo que necesitaría usar una mirada hacia atrás negativa, lo cual es posible pero ciertamente no está relacionado con el uso de {1}.Ninguna versión de la expresión regular aborda ese problema en particular.

Para dejar que el código hable:

tibook 0 /home/jj33/swap > cat text
Text this is http://example.com text this is
Text this is http://http://example.com text this is
tibook 0 /home/jj33/swap > cat p
#!/usr/bin/perl

my $re1 = '((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)';
my $re2 = '((mailto\:|(news|(ht|f)tp(s?))\://)\S+)';

while (<>) {
  print "Evaluating: $_";
  print "re1 saw \$1 = $1\n" if (/$re1/);
  print "re2 saw \$1 = $1\n" if (/$re2/);
}
tibook 0 /home/jj33/swap > cat text | perl p
Evaluating: Text this is http://example.com text this is
re1 saw $1 = http://example.com
re2 saw $1 = http://example.com
Evaluating: Text this is http://http://example.com text this is
re1 saw $1 = http://http://example.com
re2 saw $1 = http://http://example.com
tibook 0 /home/jj33/swap >

Entonces, si hay una diferencia entre las dos versiones, no parece ser la que sugieres.

No creo que {1} tenga ninguna función válida en esa expresión regular.

(**mailto:|(noticias|(ht|f)tp(s?))://){1}**

Deberías leer esto como:"capturar las cosas en los padres exactamente una vez".Pero realmente no nos importa capturar esto para usarlo más adelante, por ejemplo, $1 en el reemplazo.Entonces no tiene sentido.

No creo que tenga ningún propósito.Pero debido a que RegEx es casi imposible de entender/descomponer, la gente rara vez señala errores.Probablemente por eso nadie más lo señaló.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top