; Parametre à travailler $adresse_de_base = InputBox("adresse de base", "format : XXX.XXX.XXX.XXX/YY","") If @error Then Exit ; Structure des variables $adresse_de_base_split = StringSplit($adresse_de_base,"/") $adresse = StringSplit($adresse_de_base_split[1],".") $limite = Number($adresse_de_base_split[2]) For $i = 1 to $adresse[0] $adresse[$i] = StringFormat("%03d", $adresse[$i]) Next ; Traitement $regexp = "" For $i = 1 to 4 $regexp_loop = "" Local $imin = 8*$i-8, $imax = 8*$i-1 If $imax < $limite Then ; similaire au début de la ligne ConsoleWrite("cas début"&@CRLF) $regexp_loop = getRegexpForInterval(Number($adresse[$i])) ElseIf $limite <= $imin Then ; similaire à la fin de la ligne ConsoleWrite("cas fin"&@CRLF) $regexp_loop = getRegexpForInterval(0,255) Else ; entre les deux ConsoleWrite("cas milieu"&@CRLF) $split = $limite - $imin Local $min = 0, $max = 0, $binary = binaryValue(Number($adresse[$i])) $min = numberValue(StringLeft(StringLeft($binary,$split)&"00000000",8)) $max = numberValue(StringLeft(StringLeft($binary,$split)&"11111111",8)) ConsoleWrite($binary&"/"&$split&" : ["&$min&","&$max&"]"&@CRLF) $regexp_loop = getRegexpForInterval($min,$max) EndIf If $regexp <> "" Then $regexp = $regexp & "\." $regexp = $regexp & cond(StringInStr($regexp_loop,"|"),"("&$regexp_loop&")",$regexp_loop) Next $regexp = "^" & $regexp & "$" ; Résultat MsgBox(0,"REGEXP", '"'&$regexp&'"') ; Conditionnelle rapide, équivalent à (a?b:c) Func cond($cond, $true, $false) If $cond Then Return $true Return $false EndFunc ; décomposer en centaine dizaine unité Func decomposer($v, ByRef $c, ByRef $d, ByRef $u) $u = Mod($v, 10) $d = Mod(($v-$u)/10, 10) $c = Mod(($v-10*$d-$u)/100, 10) EndFunc ; regexp d'un intervalle Func getRegexpForInterval($min,$max=-1) ConsoleWrite(@CRLF&@TAB&"["&$min&","&$max&"]") If $max = -1 Or $min >= $max Then Return ""&$min If $min < 0 Then $min = 0 If $max > 255 Then $max = 255 If $min = 0 And $max = 255 Then Return "1?[0-9]{1,2}|2[0-4][0-9]|25[0-5]" ; Variables Local $regexp = "" Local $unite, $dizaine, $centaine Local $uniteMax, $dizaineMax, $centaineMax decomposer($min, $centaine, $dizaine, $unite) decomposer($max, $centaineMax, $dizaineMax, $uniteMax) If $centaine = $centaineMax And $dizaine = $dizaineMax Then ; deux premiers chiffres identiques cdX-cdY, exemple 145 à 148 ; Intervalle des unités (exemple [145,148] : "14[5-8]") Return _ cond($centaine=0, "", $centaine) & _ cond($centaine=0 and $dizaine=0, "", $dizaine) & _ "["&$unite&"-"&$uniteMax&"]" ElseIf $centaine = $centaineMax Then ; premier chiffre identique cXX-cYY, exemple 145 à 174 ; Intervalle jusqu'à la prochaine dizaine (exemple 145=>[145,149] : "14[5-9]") If $unite > 0 Then If $regexp <> "" Then $regexp &= "|" $regexp &= getRegexpForInterval( _ $min, _ $centaine*100+$dizaine*10+9 _ ) ; Prochaine dizaine $min = $centaine*100+($dizaine+1)*10 decomposer($min, $centaine, $dizaine, $unite) EndIf ; Intervalle des dizaines (exemple [150,169] : "1[5-6][0-9]") If $dizaine <= $dizaineMax-1 Then If $regexp <> "" Then $regexp &= "|" If $uniteMax = 9 Then $regexp &= _ cond($centaine=0, "", $centaine) & _ cond($centaine=0 and $dizaine=0, _ cond($dizaineMax=1,"",cond($dizaineMax=2,"1","[1-"&$dizaineMax&"]")&"?"), _ cond($dizaine=$dizaineMax,$dizaine,"["&$dizaine&"-"&$dizaineMax&"]") _ ) & _ "[0-9]" ; Passage à la fin de la dernière dizaine $min = $centaine*100+($dizaineMax+1)*10 decomposer($min, $centaine, $dizaine, $unite) Else $regexp &= _ cond($centaine=0, "", $centaine) & _ cond($centaine=0 and $dizaine=0, _ cond($dizaineMax=1,"",cond($dizaineMax=2,"1","[1-"&($dizaineMax-1)&"]")&"?"), _ cond($dizaine=$dizaineMax-1,$dizaine,"["&$dizaine&"-"&($dizaineMax-1)&"]") _ ) & _ "[0-9]" ; Passage à la dernière dizaine $min = $centaine*100+$dizaineMax*10 decomposer($min, $centaine, $dizaine, $unite) EndIf EndIf ; Intervalle à partir de la dernière dizaine si elle n'a pas été traitée If $uniteMax <> 9 Then If $regexp <> "" Then $regexp &= "|" $regexp &= getRegexpForInterval( _ $min, _ $max _ ) ; FIN $min = $centaine*100+($dizaine+1)*10 decomposer($min, $centaine, $dizaine, $unite) EndIf Else ; XXX-YYY, exemple 145 à 224 ; Intervalle jusque la prochaine centaine (exemple 145=>[145,199] : "14[5-9]|1[5-9][0-9]") If $dizaine+$unite > 0 Then If $regexp <> "" Then $regexp &= "|" $regexp &= getRegexpForInterval( _ $min, _ $centaine*100+99 _ ) ; Prochaine centaine $min = ($centaine+1)*100 decomposer($min, $centaine, $dizaine, $unite) EndIf ; Région 0-200 If $centaine = 0 And $centaineMax = 2 Then If $regexp <> "" Then $regexp &= "|" $regexp &= "1?[0-9]{1,2}" ; Prochaine centaine $min = 200 decomposer($min, $centaine, $dizaine, $unite) EndIf ; Région 0-100 If $centaine = 0 And $centaineMax = 1 Then If $regexp <> "" Then $regexp &= "|" $regexp &= "[0-9]{1,2}" ; Prochaine centaine $min = 100 decomposer($min, $centaine, $dizaine, $unite) EndIf ; Région 100-200 If $centaine = 1 And $centaineMax = 2 Then If $regexp <> "" Then $regexp &= "|" $regexp &= "1[0-9]{2}" ; Prochaine centaine $min = 200 decomposer($min, $centaine, $dizaine, $unite) EndIf ; Intervalle à partir de la dernière centaine If True Then If $regexp <> "" Then $regexp &= "|" $regexp &= getRegexpForInterval( _ $min, _ $max _ ) ; FIN $min = ($centaine+1)*100 decomposer($min, $centaine, $dizaine, $unite) EndIf EndIf Return $regexp EndFunc ; valeur binaire sur 8 bits en string Func binaryValue($value) Local $result = "", $valueToTest = $value For $i = 0 To 7 Local $rest = Mod($valueToTest,2) $result = $rest&$result $valueToTest = ($valueToTest-$rest)/2 Next Return $result EndFunc ; valeur entière à partir d'un string Func numberValue($value) Local $result = 0, $valueToTest = StringSplit($value,"") For $i = 1 To $valueToTest[0] $result = Number($valueToTest[$i])+$result*2 Next ConsoleWrite("'"&$value&"' : "&$result&@CRLF) Return $result EndFunc