2010-02-26 8 views
6

Ho pensato che sarebbe stata una semplice ricerca su Google ma apparentemente no. Che cosa è una regex che posso utilizzare in C# per analizzare un URL includendo qualsiasi stringa di query da un testo più grande? Ho trascorso molto tempo e ho trovato molti esempi di quelli che non includono la stringa di query. E non posso usare System.URI, perché questo presuppone che tu abbia già l'URL ... Ho bisogno di trovarlo nel testo circostante.regex per l'URL, inclusa la stringa di query

+0

Quali sono le regole? Saranno correttamente codificati o potrebbero esserci degli spazi nella stringa? Se saranno codificati correttamente, quasi tutti i pattern che hai precedentemente dovrebbero funzionare se aggiungi semplicemente aggiungi una ricerca per caratteri non spazi bianchi alla fine di esso. – Guildencrantz

risposta

3

Questo dovrebbe ottenere qualsiasi cosa (sentitevi liberi di aggiungere protocolli aggiuntivi):

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

La vera difficoltà è trovare alla fine. Così com'è, questo modello si basa sulla ricerca di un carattere non valido. Sarebbe qualcosa di diverso da lettere, numeri, trattino o punto prima della fine del nome di dominio, o qualcosa di diverso da quelli più barra (/), punto interrogativo (?), E commerciale (&), segno di uguale (=), punto e virgola (;), segno più (+), punto esclamativo (!), apostrofo/virgoletta singola ('), parentesi aperta/chiusa, asterisco (*), trattino basso (_), tilde (~) o segno di percentuale (%) dopo il nome del dominio.

Si noti che questo permetterebbe URL non validi come

http://../ 

E sarebbe raccogliere roba dopo un URL, come ad esempio in questa stringa:

Forse si dovrebbe cercare http://www.google.com.

Dove "http://www.google.com." (con il periodo di trascinamento) corrispondeva.

Sarebbe anche perdere gli URL che non è iniziata con una specifica di protocollo (in particolare, i protocolli entro il primo gruppo di parentesi, per esempio, sarebbe perdere l'URL in questa stringa:.

Forse dovrebbero provare www.google.com.

E 'molto difficile ottenere ogni caso senza alcuni confini più definiti.

+0

Non funziona ... vedi la risposta qui: http://stackoverflow.com/questions/9125016/get-url-from-a-text – kape123

+0

@ kape123: "Non funziona" non è molto utile. Ho fatto notare esattamente quali fossero i suoi difetti. Funziona come descritto. C'è qualche altro caso che ti aspetti di lavorare che non sia? –

0

Utilizzare l'ABNF alla fine di RFC3986 come punto di partenza per farlo bene.

Questo li utilizza per la convalida URI in Python; non è quello che stai cercando, ma dovrebbe dare un'idea della direzione in cui dovresti andare: http://gist.github.com/138549

0

Mi dispiace, ma non sono ancora in grado di aggiungere commenti, ma vorrei sottolineare che la risposta di P Daddy richiede un piccolo ritocco:

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

Non riesco a trovare nulla di diverso, tranne che hai invertito l'ordine dei caratteri maiuscoli e minuscoli (un no-op), e così facendo, corretto un refuso che avevo dove avevo "aZ" (minuscolo) un 'al maiuscolo' Z'). La prossima volta sarebbe più semplice indicare semplicemente l'errore di battitura. Lo aggiusterò. –