[R] Expression régulière.

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

[R] Expression régulière.

#1

Message par ani »

sujet important !!

ma première question est de savoir si on peut afficher une sorte de bloque ?

je prend un fichier exemple ::
C:\WINDOWS\SYSTEM32\DRIVERS\etc\HOSTS

il commence par #Start blabla et fini par #End blabla, entre les deux c'est le dit "bloque" (comment afficher l'ensemble ?)

dans la doc ccm il dise que ce caractere ^ signifie début et $ fin j'ai bien essayé avec le ^ mais rien


lire le fin ligne ou debut ligne c'est possible ?

y ausssi un petit script dans l'aide d'autoit
C:\Program Files\AutoIt3\Examples\Helpfile\StringRegExpGUI.au3

je dispose de la version 3.2.4.2 (oui toujours pas à jour) (je l'ai déjà dit ^^'), le soft en lui meme at'il etait modifié ? (nbre de ligne 185),, je répond encore a ma question oui une autre version fut sortie (nmbre de ligne 245) mais rien de supplementaire au niveau des expressions régulière :(

fichier dl ici strRegExpGui

cette Gui fonctionne avec un fichier ini pour rajouter des parttern (d'expression régulière, seul dispo (.*))

si vous avez des info a apporter sur le sujet n'hésité surtout pas, avec exemple et bien expliquer l'expression citée :) , en vous remerciant d'avance.


lecture = http://www.autoitscript.com/autoit3/pcrepattern.html

ou wikiFr = regular expression
Modifié en dernier par ani le jeu. 13 sept. 2007 18:12, modifié 3 fois.
Max5
Niveau 2
Niveau 2
Messages : 24
Enregistré le : mar. 11 sept. 2007 19:20
Status : Hors ligne

Re: Regular expression..

#2

Message par Max5 »

ani a écrit : il commence par #Start blabla et fini par #End blabla, entre les deux c'est le dit "bloque" (comment afficher l'ensemble ?)
Pour afficher ce genre de chose début/fin, pas besoin des regexp, autoit a une belle fonction appelé _StringBetween(). :D

Les expression reguliere servent plutot a mon avi a retirer quelque(s) chose(s) de précis dans un bloque.

A moin que j'ai mal comprit la question...

mon fichier hosts contient ceci :
# Copyright (c) 1993-1999 Microsoft Corp.
#
# Ceci est un exemple de fichier HOSTS utilisé par Microsoft TCP/IP
# pour Windows.
#
# Ce fichier contient les correspondances des adresses IP aux noms d'hôtes.
# Chaque entrée doit être sur une ligne propre. L'adresse IP doit être placée
# dans la première colonne, suivie par le nom d'hôte correspondant. L'adresse
# IP et le nom d'hôte doivent être séparés par au moins un espace.
#
# De plus, des commentaires (tels que celui-ci) peuvent être insérés sur des
# lignes propres ou après le nom d'ordinateur. Ils sont indiqué par le
# symbole '#'.
#
# Par exemple :
#
# 102.54.94.97 rhino.acme.com # serveur source
# 38.25.63.10 x.acme.com # hôte client x

127.0.0.1 localhost
Les regexp servirait plus a retirer les numeros IP par exemple.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#3

Message par ani »

marche pas le stringbetween() j'ai pas suivit l'utiliité" il retire juste le debut et fin caractere x

je prenais l'exemple de ce fichier pour savoir si c'etait possible pour de simple fichier text qui ne dispose pas de balise html ou autre extension .

je répond a ma propre question après quelque test de super novice ^__^, oui c'est tout à fait possible.

si on recherche #start.* il affiche la ligne
si on recherche #+\s+.* il affiche tout les menu # [ (categorie)
si on recherche 127.0.0.1+\s+.* il affcihe toute les ip 127.0.0.1 avec leur site et commentaire

le \s signifie white space (un espacement)

idem pour l'ip
\b(?:\d{1,3}\.){3}\d{1,3}\b\s+.* mais je la trouve lente...

dans les categorie on y voit 127.0.0.1 machin.com #commentaire

l'idée de soft serait de lire (de feuilleté) chaque catégorie dans 3colonne :)
ip|site|comment

et d'ameliorer, plutot d'ajouter des + au strRegExpGui (comme le soft proposé par max5) :)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#4

Message par sylvanie »

Bonsoir tout le monde

petit rappel valant son pesant de ce que vous voulez :
^ signifie début du bloc d'info, donc si c'est une ligne, c'est le début de ligne, mais si c'est un gros bloc de plusieur ligne, alors ce ne sera que le début de ce bloc

$ idem pour la fin

\s espace+tab verticale (si si ça existe) et horizontale ET retour chariot

Maintenant pour décomposer un fichier host, voici 2 méthode, dont la première redécoupée en 2 (vous verrez pourquoi dans les commentaires)
le but étant d'isoler les lignes de type xxx.xxx.xxx.xxx nom_machine #commentaire
après faudra passer par du stringsplit pouravoir des tableaux si ça vous dit

notez qu'on peut remplacer dans la suit \x0d et \x0a respectivment par \r \n

#include <Array.au3>
$title = " my_host.txt "
; version un gros bloc , gardez à l'esprit que ^ désignera le début du bloc et $ la fin du bloc , pas les début et fin de ligne !
$host_file = FileRead ( $title )
$list_host = StringRegExp ( $host_file , " ( \d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}.* ) " , 3 )
_ArrayDisplay ( $list_host , " méthode gros bloc " )
;inconvénient , on s'embarque les exemple qui ne peuvent être filtrés ainsi et les carrés que
;vous voyez sont les \r du retours chariot , car . veut dire tout sauf \n , et un retours chariot
;dans windows c'est \r\n d'où ce reliquat , nous verrons juste après coment y remédier
; et après on gère avec du stringsplit dérière si on veut redécouper ...
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; toujours méthode 1 mais sans les \r :
$title = " my_host.txt "
; version un gros bloc , gardez à l'esprit que ^ désignera le début du bloc et $ la fin du bloc , pas les début et fin de ligne !
$host_file = FileRead ( $title )
$list_host = StringRegExp ( $host_file , " ( \d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}[^\x0d\x0a]* ) " , 3 )
;on remplace .* par [\x0d\0a]* ce qui veut dire tout sauf \r ( = 0x0d ) et \n ( = 0x0a )
_ArrayDisplay ( $list_host , " méthode gros bloc sans \r " )

; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

; toujours méthode 1 mais sans les \r ni les lignes d'exemples contenant des ip :
$title = " my_host.txt "
; version un gros bloc , gardez à l'esprit que ^ désignera le début du bloc et $ la fin du bloc , pas les début et fin de ligne !
$host_file = FileRead ( $title )
$list_host = StringRegExp ( $host_file , " [^\x0d\x0a]*\s* ( \d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}[^\x0d\x0a]* ) " , 3 )
;même méthode que tout à l'heure , mais à l'avant. Comme nous somme dans un gros bloc , on lui dit :
;on choisit qq chose qui ne commence pas par un retour chariot ( du coups on indique une nlle ligne )
;suivit d'éventuellement d'espaces , tab etc ... sauf ( retour chariot puisqu'on les a banni avant ^^
;puis commence la sélection grâce aux parenthèses , et le reste c'est le cas précédent.
_ArrayDisplay ( $list_host , " méthode gros bloc sans \r et exemple commentés éventuels " )
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
;méthode ligne par ligne , c'est pareil , mais la différence est que 1 bloc = 1 ligne et donc ici ça coincide
$host_file = FileOpen ( $title , 0 )
$delimiteur = @crlf; je vais passer par la construction d'une string qu'on splitera grâce à ce délimiteur
;vu qu'on n'embarque pas de retours chariot , on élimine les risques de colisions
; sinon cf une autre méthode sur les tableau dynamique qq posts plus bas
$ligne_host = " "
While 1
$ligne = FileReadLine ( $host_file )
if @error = - 1 Then ExitLoop
$list_host = StringRegExp ( $ligne , " ^\s* ( \d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}.* ) $ " , 3 )
;là par contre le fait de dire je sélectionne ce qui commence par 1 ou plusieur espace suivit de 1 à 3 digit
;enlève le pb des commentaires
If IsArray ( $list_host ) Then $ligne_host& = $list_host[0]&$delimiteur
WEnd
$list_host = StringSplit ( $ligne_host , @CRLF , 1 )
_ArrayDisplay ( $list_host , " méthode ligne par ligne " )
FileClose ( $host_file )
Exit 0


[edit]
et un dernier un méthode 2 de regexp pour faire une sélection sur les 3 infos à recueillir en même temps :

;méthode ligne par ligne , c'est pareil , mais la différence est que 1 bloc = 1 ligne et donc ici ça coincide
$host_file = FileOpen ( $title , 0 )
While 1
$ligne = FileReadLine ( $host_file )
If @error = - 1 Then ExitLoop
$nOffset = 1
While 1
$list_host = StringRegExp ( $ligne , " ^\s* ( \d{1 , 3}\.\d{1 , 3}\.\d{1 , 3}\.\d{1 , 3} ) \s* ( \S* ) \s* ( .* ) $ " , 2 , $nOffset )
If @error = 0 Then
$nOffset = @extended
Else
ExitLoop
EndIf
For $i = 0 To UBound ( $list_host ) - 1
MsgBox ( 0 , " RegExp Test with Option 1 - " & $i , $list_host[$i] )
Next
WEnd
WEnd
FileClose ( $host_file )
Exit 0

Code : Tout sélectionner

"^\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*(\S*)\s*(.*)$"
^\s* : comme on es en ligne par ligne, celà signifie ce qui commence depuis le début de ligne par 0 ou plusière espace, tab ...

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) puis par xxx.xxx.xxx.xxx avec xxx pouvant être 1 à 3 digits que je sélectionne grâce aux ()
\s* : suivi de 0 ou plusieur espaces, tab ... que je ne sélectionne pas
(\S*) : suivi d'une chaine de caractère ne comprenant pas d'espace, et que je sélectionne
\s* : suivi de 0 ou plusieurs espaces tab ... que je ne sélectionne pas
(.*)$ : et tout le reste jusqu'à la fin que je sélectionne

donc comme on peut le voir on il ya pleins de façons différentes d'arriver au résultat ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#5

Message par ani »

héhé super comme çà, j'ai compris l'essentiel :)
merci pour les different exemple, grandiose.

je vais déjà essayer l'idée et imaginer l'interface :o
et comprendre les flags (0->4),

quelqu'un a essayé sinon le script disponible StringRegExpGui
il me parait lent défois

je retourne en lecture & exercice :D

encore merci
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#6

Message par ani »

pour les chiffres \d mais pour les hexa ? j'ai essay [[xdigit]] mais j'ai rien ...j'ai essayé (0x)([\d\w]+) la j'obtien l'info :(
comment on utilise les classes si on peut les utiliser ?

et pour tout les caractere du style ()[],+-*/& ? y a une formule préconçus ? j'avais essayé ([\[\]\ ect mais là j'ai des erreur)
([+,.&)({}]) pour lemoment j'utilise ceux-ci mais sans les [ et ] ,, vais refaire des test de novices ^__^

en restant dans le regexp.
stringRegExpReplace pour la partie replace il dise :
autoit_chm a écrit :The text to replace the regular expression matching text with. To insert matched group text, \0 - \9 (or $0 - $9) can be used as back-references.
je comprend ceux-ci est-ce juste?

stringRegExpReplace('mon_fichier','(L'expression)',\1 $Ma variable)

je confirme c'est bien çà ^__^
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#7

Message par sylvanie »

pour les valeurs hexa, j'ai déjà eu des pbs avec [xdigits] et lu sur le forum anglais des cas de mauvais fonctionnement.
Passe effectivement par 0x[\dabcdefABCDEF]{2} pour des valeurs de type 0xe2; et passe à{8} pour les long.

Pour les varirable backward de remplacement, il faut le voir plus comme une récupération de la sélection pour la récupérer dans la modif. petit exple :

$str = " ti450 "
$str = StringRegExpReplace ( $str , " ( \w{2} ) ( \d{3} ) " , " $2$1 " )
ConsoleWrite ( $str )


je sélectionne deux caractère puis 3 chiffres. les sélections sont scindées : 1 pour les 2 caractères, une autre pour les 3 chiffres
dans l'exemple de remplacement, je dis d'inverser ces sélections : $2$1
ainsi de ti450 on passe à 450ti

Seul truc non réalisable pourr l'instant directement, c'est de faire agir un autre fonction autoit sur ces retour $1...$9 par expemple remplacer avec stringupper($1) ne fonctionnera pas, car $1 est un élément de syntaxe de StringRegExpReplace, alors que dans stringupper($1), $1 doit être une var purement autoit.
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#8

Message par ani »

d'accord :) , j'avais bien suivit ,,,, j'évolue \o/

Après de longue lecture sur le sujet, j'ai pu remarquer que le traitement de texte se faisait sur une seul ligne.

1. Replace @cr ou @crlf par @lf
2. Un split sur le lf
3. Le Traitement
4. La Sortie = traitement & @crlf

le traitement se faisait par caractère et non par mots (suis-je dans le bon ?) = stringlen et stringmid.

je suis au point 3, difficil :(transformation d'un fichier dans un array):



(pour le fichier host, je vais essayer de concevoir une interface .. je vais essayer ,,, y a des amateurs ? - pas grand monde ^__^ )
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#9

Message par ani »

est-il possible d'utiliser l'objet regexp ?

Code : Tout sélectionner

objcreate(System.Text.RegularExpressions.Regex)
?

en faite j'ai pas suivit pourquoi on ne peut indiquer la majuscule a la variable ?

Code : Tout sélectionner

$str = "ti450" 
$str = StringRegExpReplace($str, "(\w{2})(\d{3})", "$2$1") 
ConsoleWrite($str) 

si on change en ceux-ci 
$str = StringRegExpReplace($str, "(\w{2})(\d{3})", "/2/1")
ou qu'on ecrit le replace de cette maniere "/2$1" c'est identique

pour revenir avec la majuscule dans ce genre de fonction stringregreplace si dans notre recherche on voudrait le remplacer mais en indiquant la majuscule au premier word (j'ai déjà du demander, je vérifie ) j'ai vu de \U mais bon j'essaie aussi le soft d'autoit le pcre.exe mais hm


je retourne dans le book :(
et je test le programme regexp du nom de regulator (tu connais ?)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#10

Message par sylvanie »

effectivement \2 et $2 en regexp c'est la même chose

pour la version objet, j'en sais rien du tout.

Je ne connais pas non plus regulator
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#11

Message par ani »

ok, c'est la doc framework.net que j'ai vu çà, je demande au cas ou ;)

on pourrait utilisé si on peut le index/lastindex lef/right ect


j'ai testé le soft mais il est anglais date 2003 il se fait vieux mais il peu verfier sur un site regexlib (anglais) /snippet ect
mais là j'ai pas trop suivit le fonctionnement j'ai cru au hightlight mais y a pas,,, je vais demander sur le fofo anglais si sa serait possible pour la prochaine version du stringregexpgui d'y mettre la coloration :) , mais pour revenir a regulator, je laisse de coté vu que j'y est compris.. meme le pcre.exe je pige pas et la doc il explique meme pas :(
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#12

Message par ani »

hello

et bien j'arrive pas a selectionner avec le regex :(

voici le pattern <span>(.*?)</span>

y aurai une facon pour remplacer

Code : Tout sélectionner

 StringSplit(StringStripCR($lecture), @LF)
en regexp ?

ci dessous le format de sortie de trouvera sur une seul ligne
mais je veux selectionner le pattern il me sort des 111111111111111111111 pas suivit pourtant avec stringrreggui il me le sort correctement ou si vous voyez une autre maniere de pattern pour selectionner le span à span sa serait bien

Code : Tout sélectionner

$lecture = FileRead("C:\Program Files\AutoIt34\SciTE\buddylist\KITKAT1.html", FileGetSize("C:\Program Files\AutoIt34\SciTE\buddylist\KITKAT1.html")) 
$Lecture = StringSplit(StringStripCR($lecture), @LF) 

for $j = 1 to $Lecture[0] 
ConsoleWrite($lecture[$j]) 
next
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#13

Message par sylvanie »

pour spliter un texte en ligne sans retours chariot \r ni \n,
il faut sélectionner tous les caractères consécutifs ne contenant ni \ r ni \n

ce qui ce traduit par tout ce qui se suit sans \r et \n : [^\r\n]+

Code : Tout sélectionner

$text = " blabla " &@CRLF& " bleble " &@CRLF& " blibli " &@CRLF 
$tab = StringRegExp ( $text , " [^\r\n] + " , 3 ) 
If Not IsArray ( $tab ) then Exit 1 
For $ind = 0 to UBound ( $tab ) - 1 
ConsoleWrite ( $tab[$ind]&@CRLF ) 
Next
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#14

Message par ani »

j'adore :)

dommage je l'avais presque ^^ \r\t (?m)

bon je retourne si pas grrrrrr ;)

voilà fini :)
j'ai un peu cafouillier ^^'

passage au niveau deux maintenant ^^'
je craqueeeee :D
Répondre