2011-02-24 4 views
1

Possible en double:
Get a URL from a Stringget url de chaîne

Salut, im essayant d'extraire une URL à partir d'une chaîne à l'aide regexp. la chaîne est quelque chose comme: "lorem ipsum bébé www.test.com lorem", "lorem ipsum http://www.test.com foo bar" ou "lorem www.test.com" sans espaces de fin.
en utilisant
MatchCollection ms = Regex.Matches(adress, @"(www.+|http.+)([\s]|$)");
renvoie la chaîne entière. Est-ce qu'un regexp-guru pourrait m'aider sur celui-ci?

Edit:
Résolu cette façon:
MatchCollection mc = Regex.Matches(adress, @"(www[^ \s]+|http[^ \s]+)([\s]|$)", RegexOptions.IgnoreCase);
adress = mc[0].Value;
WebBrowserTask task = new WebBrowserTask();
task.URL = adress;
task.Show();

Merci à tous pour votre aide! :)

+0

Si vous recherchez ** TRÈS ** primitif: '((?: Https?: \/\/| Www | [^ \ s] + \. [Az] {2,3}) [^ \ s] *?) [\. \?;:]? 'devrait fonctionner. Mais vous aurez besoin d'une regex très longue pour éliminer tous les méta-caractères qui pourraient entourer les URL, ou être à l'intérieur d'eux, etc. –

+0

Cet endroit tourne-t-il sur sa tête? –

+3

avec le nombre de personnes qui veulent une regex pour correspondre à une URL, microsoft devrait faire une bibliothèque standard d'expressions communes et le mettre dans le cadre .NET quelque part. Je pense que ce serait cool de faire juste 'Url.Matches (adresse)' ou 'Guid.Matches (@string)' ou 'DateTime.Matches (@string)' – kelloti

Répondre

4

Je pense que nous manquons l'évidence ici qu'il n'y a en fait rien de mal à ce code.

Peut-être que l'OP n'appelle pas correctement la valeur de match.value.

string adress = "hello www.google.ca"; 
// Size the control to fill the form with a margin 
MatchCollection ms = Regex.Matches(adress, @"(www.+|http.+)([\s]|$)"); 
string testMatch = ms[0].Value.ToString(); 

testMatch ne contient que "www.google.ca"

est-ce pas votre Newa intention?

+0

Oui, c'était le problème. : | Merci :) – nevva

+0

Pas un problème, à tout moment! – clamchoda

0

Je pense que le problème est que le "." L'identificateur correspond à tout, y compris les espaces de fin auxquels vous voulez mettre fin à la capture. Si vous changez le ". +" En "[^] +", ou que vous effectuez la première capture "non-répréhensible" en plaçant un "?:" Juste à l'intérieur de la parenthèse ouvrante, vous devriez obtenir la réponse désirée.

3

Essayez quelque chose comme ceci:

string txt = "lorem ipsum baby http:\\\\www.google.com\/"; 
Regex regx = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", 
RegexOptions.IgnoreCase); 
MatchCollection ms = regx.Matches(txt); 
+0

Auteur voulait correspondre à "www" préfixe, non seulement ceux qui ont commencé avec http. De toute façon, je pense que [RegExLib] (http://regexlib.com/) est un bon point de départ. –