2010-02-26 10 views
6

Pensé que esto sería una simple búsqueda en Google pero aparentemente no. ¿Qué es una expresión regular que puedo usar en C# para analizar una URL incluyendo cualquier cadena de consulta de un texto más grande? He pasado mucho tiempo y he encontrado muchos ejemplos de los que no incluyen la cadena de consulta. Y no puedo usar System.URI, porque eso supone que ya tienes la URL ... Necesito encontrarla en el texto que la rodea.regex para URL incluyendo cadena de consulta

+0

¿Cuáles son las reglas? ¿Van a estar codificados correctamente o podrían haber espacios en la cadena? Si se van a codificar correctamente, bastará con cualquiera de los patrones que anteriormente debería haber funcionado si agrega simplemente agregar una búsqueda de caracteres que no sean de espacios en blanco hasta el final. – Guildencrantz

Respuesta

3

Esto debe conseguir casi cualquier cosa (no dude en añadir protocolos adicionales):

@"(https?|ftp|file)\://[A-Za-z0-9\.\-]+(/[A-Za-z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*" 

La verdadera dificultad es encontrar el final. Como es, este patrón se basa en encontrar un personaje inválido. Eso sería cualquier cosa que no sean letras, números, guiones o un período anterior al final del nombre de dominio, o cualquier cosa que no sean esos más barra diagonal (/), signo de interrogación (?), Ampersand (&), signo igual (=), punto y coma (;), signo más (+), signo de exclamación (!), apóstrofo/comilla simple ('), paréntesis de abrir/cerrar, asterisco (*), guión bajo (_), tilde (~) o signo de porcentaje (%) después del nombre de dominio.

Tenga en cuenta que esto permitiría a las direcciones URL no válidas como

http://../ 

Y sería recoger cosas después de un URL, como en esta cadena:

tal vez debería tratar http://www.google.com.

Donde "http://www.google.com." (con el período de salida) coincidirían.

También se perdería URL que no comenzó con una especificación de protocolo (en concreto, los protocolos dentro del primer conjunto de paréntesis, por ejemplo, que se perdería el URL en esta cadena:.

Tal vez debe tratar de www.google.com.

es muy difícil conseguir todos los casos sin algunos límites mejor definidos.

+0

No funciona ... vea la respuesta aquí: http://stackoverflow.com/questions/9125016/get-url-from-a-text – kape123

+0

@ kape123: "No funciona" no es muy útil. Señalé exactamente cuáles eran sus deficiencias. Funciona como se describe. ¿Hay algún otro caso que esperas que funcione que no funcione? –

0

Utilice el ABNF al final del RFC3986 como punto de partida para hacerlo bien.

Esto los usa para la validación de URI en Python; no es lo que está buscando, pero debería darle una idea de la dirección en la que debe ingresar: http://gist.github.com/138549

0

Disculpe que aún no puedo agregar comentarios, pero me gustaría señalar que la respuesta de P Daddy requiere un pequeño ajuste:

@"(https?|ftp|file)\://[a-zA-Z0-9\.\-]+(/[a-zA-Z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*" 
+1

No puedo encontrar nada diferente, excepto que invirtió el orden de los caracteres en mayúscula y minúscula (no operativa), y al hacerlo, corrigió un error tipográfico que tenía donde tenía 'aZ' (minúscula) a 'a mayúscula' Z'). La próxima vez, sería más simple simplemente señalar el error tipográfico. Lo arreglaré. –

Cuestiones relacionadas