Alguém conhece uma expressão regular que eu possa usar para encontrar URLs dentro de uma string? Eu encontrei muitas expressões regulares no Google para determinar se uma string inteira é um URL, mas preciso ser capaz de pesquisar URLs em uma string inteira. Por exemplo, eu gostaria de poder encontrar www.google.com
e http://yahoo.com
na seguinte string:
Hello www.google.com World http://yahoo.com
Não estou procurando URLs específicos na string. Estou procurando TODOS os URLs na string, por isso preciso de uma expressão regular.
Respostas:
Este é o que eu uso
Funciona para mim, deve funcionar para você também.
fonte
\w
pode não coincidir com símbolos internacionais (depende do motor regex), é necessário o intervalo em vez:a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF
.[\w_-]
ser[\w-]
? porque já\w
combina_
. por documentos dewww.yahoo.com
."""(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?""".r.findAllIn("www.google.com").toList
. TAMBÉM FALTA DE EXPLICAÇÃO para a respostaAcho que nenhum regex é perfeito para esse uso. Eu encontrei um bastante sólido aqui
Algumas diferenças / vantagens em relação às outras aqui postadas:
moo.com
semhttp
ouwww
Veja aqui os exemplos
fonte
g
opção não é válida em todas as implementações de expressão regular (por exemplo, implementação embutida de Ruby).Resultado:
fonte
&
Parâmetros em falta no url. por exemplo,http://test.com/method?param=wasd¶m2=wasd2
misses param2Nenhuma das soluções fornecidas aqui resolveu os problemas / casos de uso que eu tive.
O que forneci aqui é o melhor que encontrei / fiz até agora. Vou atualizá-lo quando encontrar novos casos extremos que ele não trata.
fonte
Eu acho que este padrão regex lida exatamente com o que você deseja
e este é um exemplo de snippet para extrair Urls:
fonte
Todas as respostas acima não correspondem a caracteres Unicode no URL, por exemplo: http://google.com?query=đức+filan+đã+search
Para a solução, este deve funcionar:
fonte
Eu descobri que isso cobre a maioria dos links de amostra, incluindo partes de subdiretórios.
Regex é:
fonte
Se você tiver que ser rigoroso na seleção de links, eu escolheria:
Para mais informações, leia isto:
Um padrão de regex preciso e liberal aprimorado para URLs correspondentes
fonte
Aqui está um regexp um pouco mais otimizado:
Aqui está o teste com dados: https://regex101.com/r/sFzzpY/6
fonte
Se você tiver o padrão de url, poderá pesquisá-lo em sua string. Apenas certifique-se de que o padrão não tem
^
e$
marcando o início e o final da string url. Portanto, se P for o padrão para URL, procure correspondências para P.fonte
^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$
http://regexpal.com/
; lá você pode testar diferentes expressões em sua string até acertar.Community
guia, incluindo alguns para urlsUsei a expressão regular abaixo para encontrar o url em uma string:
fonte
[a-zA-Z]{2,3}
é muito ruim para correspondência de TLD, consulte a lista oficial: data.iana.org/TLD/tlds-alpha-by-domain.txtEu uso este Regex:
Ele funciona bem para muitos URLs, como: http://google.com , https://dev-site.io:8080/home?val=1&count=100 , www.regexr.com, localhost: 8080 / path,. ..
fonte
Curto e simples. Ainda não testei o código javascript, mas parece que vai funcionar:
Código em regex101.com
fonte
Um método provavelmente muito simplista, mas pode ser:
Eu testei em Python e, desde que a análise de string contenha um espaço antes e depois e nenhum na url (que eu nunca vi antes), deve funcionar bem.
Aqui está um ide online demonstrando isso
No entanto, aqui estão alguns benefícios de usá-lo:
file:
elocalhost
também os endereços IP#
ou-
(veja o URL desta postagem)fonte
Usar a regex fornecida por @JustinLevene não tinha as sequências de escape adequadas nas barras invertidas. Atualizado para estar correto agora e adicionado na condição de corresponder ao protocolo FTP também: Irá corresponder a todos os urls com ou sem protocolos e sem "www."
Código:
^((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?
Exemplo: https://regex101.com/r/uQ9aL4/65
fonte
MELHORADO
Detecta URLs como estes:
Regex:
fonte
Escrevi um para mim:
Funciona em TODOS os seguintes domínios:
Você pode ver como funciona aqui no regex101 e ajustar conforme necessário
fonte
Esta é uma pequena melhoria / ajuste (dependendo do que você precisa) da resposta de Rajeev:
Veja aqui um exemplo do que corresponde e do que não corresponde.
Eu me livrei da verificação de "http" etc porque eu queria pegar urls sem isso. Eu adicionei um pouco ao regex para capturar alguns urls ofuscados (ou seja, onde o usuário usa [ponto] em vez de um "."). Finalmente, substituí "\ w" por "AZ" para e "{2,3}" para reduzir falsos positivos como v2.0 e "moo.0dd".
Quaisquer melhorias neste bem-vindo.
fonte
[a-zA-Z]{2,3}
é muito ruim para correspondência de TLD, consulte a lista oficial: data.iana.org/TLD/tlds-alpha-by-domain.txt . Além disso, sua regex_.........&&&&&&
não corresponde a um url válido.Eu usei isso
fonte
Se você quiser uma explicação de cada parte, tente regexr [.] Com, onde você obterá uma ótima explicação de cada caractere.
Isso é dividido por um "|" ou "OU" porque nem todos os URI utilizáveis têm "//", então é aqui que você pode criar uma lista de esquemas ou condições que você estaria interessado em combinar.
fonte
Eu utilizei a classe c # Uri e funciona bem com endereço IP, localhost
fonte
Eu gostei da solução de Stefan Henze, mas pegaria 34,56. É muito geral e tenho html não analisado. Existem 4 âncoras para um url;
www,
http: \ (e co),
. seguido por letras e então /,
ou letras. e um destes: https://ftp.isc.org/www/survey/reports/current/bynum.txt .
Usei muitas informações deste tópico. Obrigado a todos.
Acima resolve quase tudo, exceto uma string como "eurls: www.google.com, facebook.com, http: //test.com/", que retorna como uma única string. Tbh idk porque eu adicionei gopher etc. Código de prova R
fonte
Eu uso a lógica de encontrar texto entre dois pontos ou pontos
o regex abaixo funciona bem com python
fonte
Corresponder um URL em um texto não deve ser tão complexo
(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)
https://regex101.com/r/wewpP1/2
fonte
Este é o mais simples. que funcionam bem para mim.
fonte
É muito simples.
Use este padrão:
\b((ftp|https?)://)?([\w-\.]+\.(com|net|org|gov|mil|int|edu|info|me)|(\d+\.\d+\.\d+\.\d+))(:\d+)?(\/[\w-\/]*(\?\w*(=\w+)*[&\w-=]*)*(#[\w-]+)*)?
Corresponde a qualquer link que contenha:
Protocolos permitidos: http, https e ftp
Domínios permitidos: * .com, * .net, * .org, * .gov, * .mil, * .int, * .edu, * .info e * .me OU IP
Portas permitidas: verdadeiro
Parâmetros permitidos: verdadeiro
Hashes permitidos: verdadeiro
fonte
Esta é a melhor.
fonte