Page 1 sur 1
[R] RegExp et subroutines
Posté : lun. 23 sept. 2013 21:28
par jguinch
Bonsoir.
Il y a quelques jours, j'ai posté deux petites fonctions qui permettent de vérifier la conformité d'une adresse IP, et extraire les adresses IP d'une chaîne de caractères (
http://autoitscript.fr/forum/viewtopic. ... 982#p80982)
Grâce à JCHD (que je remercie), j'ai découvert les sous-routines.
J'arrive à extraire et contrôler les adresses IP sans problème, mais ce que j'aimerais faire (que je n'ai pas réussi), c'est extraire les IP en utilisant les sous-routines (donc mon problème n'est pas technique, c'est un problème de compréhension

)
J'aimerais comprendre où je bute. Surement un problème de parenthèses, mais j'ai un peu tout essayé sans succès.
La fonction qui permet de contrôler une IP (avec sous-routine) fonctionne bien:
► Afficher le texte_IPv4_IsValid
Code : Tout sélectionner
Func _IPv4_IsValide($sIP)
$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)) " & _
"$"
If StringRegExp($sIP, $pattern) Then Return 1
Return 0
EndFunc
La fonction d'extraction, que j'aimerais faire fonctionner avec les sous-routines :
► Afficher le texte_IPv4_Extract
Code : Tout sélectionner
Func _IPv4_Extract($sIP)
; en commentaire, le pattern d'orgine qui fonctionne
#CS
$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)"
#CE
; et là, le pattern qui veut pas...
$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, 3)
EndFunc
Merci d'avance pour votre aide
Euh, j'ai été clair sur l'énoncé ?
Re: [..] RegExp et subroutines
Posté : lun. 23 sept. 2013 23:59
par mikell
Très clair
C'est marrant ces sous-routines
ça a l'air de marcher
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
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."
$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 ) ) " & _
"\b(?:(?:(?&withoutzero)\.){3}(?&withoutzero)) | (?:(?:(?&withzero)\.){3}(?&withzero))\b"
$res = StringRegExp($myText, $pattern, 3)
_ArrayDisplay($res)
mais il me semble qu'il y a une erreur quelque part
► Afficher le texte
Code : Tout sélectionner
$sIP = "123.192.168.1.2"
msgbox(0,"", _IPv4_IsValide($sIP) )
Func _IPv4_IsValide($sIP)
$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)) " & _
"$"
If StringRegExp($sIP, $pattern) Then Return 1
Return 0
EndFunc
Re: [..] RegExp et subroutines
Posté : mar. 24 sept. 2013 01:04
par jchd
J'ai peut-être changé un peu le sujet de l'exercice, mais au pif, ça doit convenir :
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
Local $myText = "Les adresses IP valides peuvent être : 192.168.1.1, 193.092.103.097, avec ou sans 0." & _
"Par contre les adresses telles que 192.168.0001.1, 0.0.0.0 ou 256.168.1.10 ne sont pas valides." & _
"Attention une adresse au format : 123.192.168.1.1 ne sera pas extraite non plus."
$pattern = "(?x)(?(DEFINE)(?<withoutzero> 2[0-4]\d | 25[0-5] | 1\d{2} | [1-9]\d? ) ) " & _
"(?(DEFINE)(?<withzero> 2[0-4]\d | 25[0-5] | [0-1]?\d{1,2}) ) " & _
"(?<=[^.\d])((?:(?&withoutzero)(?:\.(?&withzero)){3}))(?=[^.\d])"
$res = StringRegExp($myText, $pattern, 3)
_ArrayDisplay($res)
Re: [..] RegExp et subroutines
Posté : mar. 24 sept. 2013 09:59
par jguinch
Merci à vous deux.
@Mikell : oui, j'ai pas géré ce cas de figure, je m'en occuperai.
Par contre, dans ton code, tu as utilisé
(?:, il me semble que c'est non-capturant. Pourquoi est-ce que la capture marche ?
@JC : ton code fonctionne également. Avec une petite modif, on obtient le résultat souhaité, mais comme pour le code de Mikell, je comprends pas pourquoi il y a besoin de faire cette modif
Code : Tout sélectionner
$pattern = "(?x)(?(DEFINE)(?<withoutzero> 2[0-4]\d | 25[0-5] | 1\d{2} | [1-9]\d? ) ) " & _
"(?(DEFINE)(?<withzero> 2[0-4]\d | 25[0-5] | [0-1]?\d{1,2}) ) " & _
"(?<=[^.\d])[b][color=#FF0000](?:[/color][/b](?:(?&withoutzero)(?:\.(?&withzero)){3}))(?=[^.\d])"
Bref...
Re: [R] RegExp et subroutines
Posté : mar. 24 sept. 2013 10:54
par jchd
Oops, c'est vrai, je t'ai laissé des niveaux de parenthèses complètement inutiles.
Code : Tout sélectionner
$pattern = "(?x)(?(DEFINE)(?<withoutzero> 2[0-4]\d | 25[0-5] | 1\d{2} | [1-9]\d? ) ) " & _
"(?(DEFINE)(?<withzero> 2[0-4]\d | 25[0-5] | [0-1]?\d{1,2}) ) " & _
"(?<=[^.\d]) (?&withoutzero) (?:\.(?&withzero)){3} (?=[^.\d])"
Re: [R] RegExp et subroutines
Posté : mar. 24 sept. 2013 13:41
par jguinch
Ok, c'est mieux, merci.
En fait, je pensais que pour capturer des données, il fallait obligatoirement mettre des parenthèses...

Re: [R] RegExp et subroutines
Posté : mar. 24 sept. 2013 18:24
par jchd
La partie qui "match" est toujours disponible.