52 votes

RegEx pour une adresse IP

J'essaie d'extraire la valeur (adresse IP) du wan_ip avec ce code source : Qu'est-ce qui ne va pas ? Je suis sûr que le modèle RegEx est correct.

String input = @"var product_pic_fn=;var firmware_ver='20.02.024';var wan_ip='92.75.120.206';if (parent.location.href != window.location.href)";
Regex ip = new Regex(@"[\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
string[] result = ip.Split(input);

foreach (string bla in result)  
{
  Console.WriteLine(bla);                
}

Console.Read();

4 votes

L'expression mise à part, ne devriez-vous pas regarder Regex.Matches plutôt que Split ?

0 votes

7 votes

999.999.999.999 ?

55voto

Bart Kiers Points 79069

En [ ne devrait pas être au début de votre motif. Aussi, vous voudrez probablement utiliser Matches(...) .

Essayez :

String input = @"var product_pic_fn=;var firmware_ver='20.02.024';var wan_ip='92.75.120.206';if (parent.location.href != window.location.href)";
Regex ip = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
MatchCollection result = ip.Matches(input);
Console.WriteLine(result[0]);

1 votes

@h0scHberT, si la suggestion de @John fonctionne, j'irais dans ce sens. Sinon, essayez le code de @SwDevMan81 : il semble plus sûr de vérifier d'abord s'il y a une correspondance. Ma suggestion (rapide) produira probablement des erreurs s'il n'y a pas de correspondance (je suis un peu un novice en C#...).

0 votes

Cela ne fonctionne pas si l'IP est dans 192.168.1.15_1.

0 votes

Ne fonctionne pas pour 008.008.008.008 qui n'est pas une adresse IPA valide mais votre motif l'accepte.

50voto

JPBlanc Points 26156

Très vieux post, vous devriez utiliser la solution acceptée, mais pensez à utiliser le bon RegEx pour une adresse IPV4 :

((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

Si vous voulez éviter les caractères spéciaux après ou avant, vous pouvez utiliser :

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

2 votes

Ça a l'air bien, mais quand je l'utilise, il correspond aussi si j'ajoute des caractères invalides à une IP valide.

3 votes

Vous avez raison, les regex supportent les préfixes et les suffixes, je modifie ma réponse.

0 votes

\b(...)\b pourrait valoir la peine d'être ajouté aussi ? Excellente réponse, d'ailleurs.

17voto

SwDevMan81 Points 22634

Essayez ça :

 Match match = Regex.Match(input, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
 if (match.Success)
 {
     Console.WriteLine(match.Value);
 }

0 votes

Il traite le cas 192.168.1.15_1.. +1

4 votes

192.168.1.15_1 ? pourquoi le considérer ?

16voto

Geograph Points 871

Si vous voulez simplement vérifier l'IP correcte, utilisez IPAddress.TryParse.

using System.Net;

bool isIP(string host)
{
    IPAddress ip;
    return IPAddress.TryParse(host, out ip);
}

1 votes

Dans Unity, cela me donne true pour "123" ô.O

6voto

Eric Brown Points 141

Je sais que ce message n'est pas nouveau, mais j'ai essayé plusieurs des solutions proposées et aucune ne fonctionne aussi bien que celle que j'ai trouvée grâce à un lien fourni par Justin Jones. Ils en ont plusieurs pour l'adresse IP mais celle-ci est en tête de liste et en utilisant LinqPad (j'adore LinqPad), la plupart des tests que j'ai effectués fonctionnent extrêmement bien. Je recommande d'utiliser celle-ci plutôt que l'une des expressions fournies précédemment :

^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$

Faites-en l'essai dans LinqPad avec les éléments suivants :

// \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b  355.168.0.1 = 355.168.0.1 (Not Correct)
// ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 355.168.0.1 = 55.168.0.1 (Not correct)
// \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}  355.168.0.1 = 355.168.0.1 (Not Correct)
// ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$  355.168.0.1 = 355.168.0.1 (Not Correct)
// ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$  355.168.0.1 = 355.168.0.1 (Not Correct)
// ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$  355.168.0.1 = No Match (Correct)

Match match = Regex.Match("355.168.0.1", @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$");
if (match.Success) {
    Console.WriteLine(match.Value);
}
else {
    Console.WriteLine("No match.");
}

Avec la nouvelle RegEx, ce n'est pas valide, ce qui est correct : 355.168.0.1 = No Match, ce qui est correct comme indiqué dans les commentaires.

Je suis heureux de pouvoir apporter des modifications à ce système, car je travaille sur un outil qui utilise l'expression et je suis toujours à la recherche de meilleures façons de procéder.

UPDATE : J'ai créé un projet .NET Fiddle pour fournir un exemple fonctionnel de cette expression ainsi qu'une liste d'adresses IP qui testent diverses valeurs. N'hésitez pas à le bricoler et à essayer différentes valeurs pour exercer cette expression et à fournir vos commentaires si vous trouvez un cas où l'expression échoue. https://dotnetfiddle.net/JoBXdI

MISE À JOUR 2 : Mieux encore, reportez-vous à cet article : Une autre question connexe.

Merci et j'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X