Regex para analisar URLs do texto

2

Eu tenho esse regex:

[a-z]+[:.].*?\s

Eu corro no seguinte texto:

regexbuddy.com
www.regexbuddy.com
http://regexbuddy.com cvc
http://www.regexbuddy.com cvcv
http://www.regexbuddy.com/ g
http://www.regexbuddy.com/index.html f
http://www.regexbuddy.com/index.html?source=library f
You can download RegexBu    ddy at http://www.regexbuddy.com/download.html. f
"www.domain.com/quoted URL with spaces"
http://10.2.2.1.2/ttxx/txt/gg v
[email protected]

Preciso corresponder ao seguinte: apenas o texto em negrito:

Como posso fazer isso?

UPDATE

@slhck seu regex revisado corresponde a quase tudo, exceto quando o URL começa com www. por exemplo  - "URL do www.domain.com/quoted com espaços"

Fiz algumas alterações na regex para corresponder ao www principal. Parece que

(https?)://.(?=\s)|(www.).?(?=\s)

Você pode, por favor, revisar? e sugerir se existem maneiras melhores de combiná-lo.

    
por asadz 23.07.2013 / 15:36

1 resposta

6

Se você não quiser incluir o espaço em branco à direita em uma partida, use uma visão antecipada negativa:

[a-z]+[:.].*?(?=\s)

No seu exemplo, isso corresponderia:

regexbuddy.com
www.regexbuddy.com
http://regexbuddy.com
http://www.regexbuddy.com
http://www.regexbuddy.com/
http://www.regexbuddy.com/index.html
http://www.regexbuddy.com/index.html?source=library
http://www.regexbuddy.com/download.html.
www.domain.com/quoted
http://10.2.2.1.2/ttxx/txt/gg

Para combinar ainda mais apenas http ou https e opcional www use algo como:

(https?):\/\/(www\.)?[a-z0-9\.:].*?(?=\s)

Aqui está regex de John Gruber para verificar o que parece ser um URL, que parece funcionar muito bem no seu caso:

(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'".,<>?«»“”‘’]))

Mas, honestamente, todas essas abordagens só vão te dar falsas correspondências, mais cedo ou mais tarde. Se você precisar de uma expressão regular para analisar URLs, consulte esta pergunta do Stack Overflow: Qual é a melhor expressão regular para verificar se uma string é uma URL válida?

    
por 23.07.2013 / 15:51

Tags