Voilà un petit moment que j'essaie de me mettre aux expressions régulières : c'est pas sans mal, mais y'a du progrès !
Donc un exercice que je m'étais donné était d'utiliser les "regex" pour contrôler la validité d'une adresse IP.
J'en ai profité pour faire une fonction qui permet d'extraire les adresses IP d'une chaîne de caractères (ça peut être utile, qui sait ?)
Voilà donc le code, avec un exemple pour chaque fonction.
En espérant que ça serve à quelqu'un...
Code : Tout sélectionner
#Include <Array.au3> ; Iniquement pour l'affichage du résultat, pas nécessaire pour les 2 fonctions
; Exemples --------------------------------------------------------------------------
Local $myIP = "192.168.1.10"
Local $myText = "Les adresses IP valides sont peuvent être : 192.168.1.1, 193.092.103.097, avec ou sans 0." & _
"Par contre les adresses telles que 192.168.001.1 ou 256.168.1.10 ne sont pas valides." & _
"Attention une adresse au format : 123.192.168.1.1 ne sera pas extraite."
If _IPv4_IsValide($myIP) Then MsgBox(0, "", $myIP & " est une adresse IP valide")
$res = _IPv4_Extract($myText)
_ArrayDisplay($res, "Extraction")
; -----------------------------------------------------------------------------------
; iFlag = 0 : retourne 0 pour une chaine de type 192.168.001.001
; 1 : retourne 1 pour une chaine de type 192.168.001.001
Func _IPv4_IsValide($sIP, $iFlag = 0)
Local $pattern = "(?:(?:(25[0-5] | 2[0-4]\d | 1\d{2} | [1-9]\d | \d)\.){3}(?1))"
If $iFlag Then $pattern &= " | (?:(?:(25[0-5] | 2[0-4]\d | [0-1]\d{2} | 0\d{2})\.){3}(?2))"
Return StringRegExp($sIP, "(?x)^" & $pattern & "$")
#CS ; Patron avec sous-routine
Local $pattern = _
"(?x)" & _
"(?(DEFINE)" & _
" (?<withoutzero>" & _
" 25[0-5] | 2[0-4]\d | 1\d{2} | [1-9]\d | \d " & _
" )" & _
")" & _
"(?(DEFINE)" & _
" (?<withzero>" & _
" 25[0-5] | 2[0-4]\d | [0-1]\d{2} | (00)\d " & _
" )" & _
")" & _
"^" & _
"(((?&withoutzero)\.){3}(?&withoutzero)) | " & _
"(((?&withzero)\.){3}(?&withzero)) " & _
"$"
Return StringRegExp($sIP, $pattern)
#CE
EndFunc
Func _IPv4_Extract($sIP)
$pattern = "(?x) (?<!\d|\d\.) ( (?:(?: (?:(?:25[0-5] | 2[0-4]\d | 1\d{2} | [1-9]\d | \d )\.){3} (?:25[0-5] | 2[0-4]\d | 1\d{2} | [1-9]\d | \d ) ) " & _
" | " & _
"(?: (?:(?:25[0-5] | 2[0-4]\d | [0-1]\d{2} | (00)\d )\.){3} (?:25[0-5] | 2[0-4]\d | [0-1]\d{2} | (?:00)\d) )) ) (?!\d|\.\d)"
Return StringRegExp($sIP, $pattern, 3)
EndFunc