Regex for comment-line

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Regex for comment-line

#1

Message par mdanielm »

Salut,
Pour me faciliter la traduction des commentaires des exemples de la documentation AutoIt, j'aurais besoin d'une regex qui capture les comment-line dans du code au3 (supposé syntaxiquement correct).
J'ai déjà trouvé une regex qui matche les comment-block, on pourra donc supposer que le code au3 n'en contient pas.

Match:
; "Comment-line"
$x='' ; chaîne "vide"
$x = "aa;aa" ; Comment-line
$x = "a" ;$x='b'

No match:
$x = 'bb;b'
$x = " " & "bb"

Aide: pour capturer des chaînes, éventuellement dans des commentaires, j'ai ça:
(
(?:"[^"\r]*(?:""[^"\r]*)*")
|
(?:'[^'\r]*(?:''[^'\r]*)*')
)

(qui semble convenir!)
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Regex for comment-line

#2

Message par orax »

Il y a peut-être tout ceci dans les scripts qui servent à générer la doc. Je pense que ça doit se trouver dans les scripts du dossier docs\_build (autoit-docs-v3.3.14.2-src.zip\docs\_build).

-----

J'ai un peu cherché, mais pour l'instant je n'ai rien trouvé, à part ce lien (trouvé dans le fichier docs\_build\include\MiscLib.au3).
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Regex for comment-line

#3

Message par mdanielm »

Merci,
Je vais regarder.
...
Semble convenir:
\r\n # fin de ligne précédente: petit problème sur la 1ere ligne
[^;"'\r\n]* # des car autre que [;"'\r\n]

(?: # pas de capture
[^;"'\r\n] # 1 car autre que [;"'\r\n] Pourquoi cette répétition?
| # ou
'[^'\r\n]*' # car ' suivi de car autre que ['\r\n]
| # ou
"[^"\r\n]*" # car " suivi de car autre que ["\r\n]
)* # 0 ou plus

\K # Réinitialise la recherche à cet endroit. Utile?
(;[^\r\n]*) # capture car ; suivi de car autre que [\r\n]
Modifié en dernier par mdanielm le mar. 05 juil. 2016 18:16, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Regex for comment-line

#4

Message par orax »

https://regex101.com/r/jS5bK7/3

Code : Tout sélectionner

(?xm)^
(?:|
  [^;"'\r\n]*
  (?:
    (?:'[^'\r\n]*')|
    (?:"[^"\r\n]*")
  )*
)
\h*\K
(;[^\r\n]*)
Il faut quand même vérifier qu'elle fonctionne correctement.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Regex for comment-line

#5

Message par jguinch »

Un poil plus court peut-être :
https://regex101.com/r/jS5bK7/4

Code : Tout sélectionner

(?:
   "[^"\r\n]*" |
   '[^'\r\n]*' |
   [^;]
)*
(;\N+)?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Regex for comment-line

#6

Message par mdanielm »

Merci pour vos indications.
Je pense tenir maintenant un algorithme pour colorer du code au3.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Regex for comment-line

#7

Message par orax »

\K # Réinitialise la recherche à cet endroit. Utile?
Non, ce n'est pas nécessaire. D'ailleurs, je l'avais supprimé sur regex101.com.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Regex for comment-line

#8

Message par mdanielm »

JGuinch, je crois que cette solution a un problème, peut-être le \N+.
Essaie avec:

$x = 'bb;b'
$x = "bb;b"
$x = " " & "bb"

Testé avec PCRE Toolkit.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Regex for comment-line

#9

Message par jchd »

Et ça, ça irait ?

Code : Tout sélectionner

(?|[^";]*"[^"]*+"|[^';]*'[^']*+')*+[^"';]*(;.*)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Regex for comment-line

#10

Message par mdanielm »

Non, pas davantage, jchd!

Testé avec pcre toolkit et les exemples suivants:

$x = 'bb;b'
$x = "bb;b"
$x = " " & "bb"

Orax, ta solution non plus:

$x = "a" & "b" ; com
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Regex for comment-line

#11

Message par jguinch »

Deuxième tentative :

Code : Tout sélectionner

(?:'.*?'|".*?"|[^;'"\r\n])*(;\N*)?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Regex for comment-line

#12

Message par orax »

Le groupe (?: ... ) est censé être non capturant.
Je pensais que le code suivant allait me retourner une erreur, mais il affiche "b".

Code : Tout sélectionner

$a = StringRegExp("abc", "(?:b)", 3)
ConsoleWrite($a[0] & @CRLF) ; affiche "b"
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Regex for comment-line

#13

Message par jguinch »

Par défaut, si aucun groupe capturant n'est spécifié, AutoIt considère qu'il faut tout capturer
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Regex for comment-line

#14

Message par mdanielm »

Jguinch, 2-ième tentative, global match:

Test:
$x = "a" & "b" ; com
$x = "a;a" ;a
$x = "b;b" ;b
$x=1;

Résultats:
[0] = ; com
[1] =
[2] = ;a
[3] =
[4] = ;b
[5] =
[6] = ;
[7] =
[8] =
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Regex for comment-line

#15

Message par jchd »

Oups, voyons si je suis plus inspiré comme ça :

Code : Tout sélectionner

Local $s = _
	'; "Comment-line"' & @CRLF & _
	"$x='' ; chaîne ""vide""" & @CRLF & _
	'$x = "a''''a;a""a" ; Comment-line' & @CRLF & _
	"y'a rien à voir ici" & @CRLF & _
	"$x = ""a"" ;$x='b'" & @CRLF & _
	"" & @CRLF & _
	";No match:" & @CRLF & _
	"$x = 'bb;b'" & @CRLF & _
	'$x = " " & "bb"           ;;ccc'

Local $a = StringRegExp($s, "(?mx)^(?:[^""';]*+(?:(?:"".*?"")++|(?:'.*?')++)?)*+[^;]*(;.*)$", 3)
_ArrayDisplay($a)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Regex for comment-line

#16

Message par orax »

J'ai un peu corrigé l'expression régulière que j'avais faite et j'ai aussi créé des tests unitaires (sur regex101) pour vérifier plus facilement si l'expression est correcte : https://regex101.com/r/lZ6oV9/1 (dans "unit tests" à gauche).

Pour pouvoir réutiliser les tests créés dans regex101 dans le but de vérifier que ça fonctionne aussi avec StringRegExp(), j'ai créé le script ci-dessous (vite fait et expérimental). Il suffit de copier-coller le texte de "unit tests" dans le script (le texte copié doit être placé entre #cs et #ce).
Ça ne marche que pour assert that capture group 1 equals et assert that regex does not match', mais c'était suffisant dans mon cas.
Si rien ne s'affiche dans la console, alors tous les tests passent sans erreur.
; expression à tester
$regex = '(?xm)^(?:  [^;"'']+  (?:    (?:''[^'']*'')|    (?:"[^"]*")  )*)*+(;\N+)'

; récupère la liste des tests unitaires
$s = StringRegExp(FileRead(@ScriptFullPath), '(?ms)^#cs\s*(.+?)\s*^#ce', 1)[0]
$s = StringRegExpReplace($s, '(?m)^\s+', '')

; le groupe 1 doit être égal à...
$a = StringRegExp($s, '(?m)^given the string\t(.+?)   assert that capture group 1   equals   (.+)', 3)
For $i = 0 To UBound($a) - 1 Step 2
   $aResult = StringRegExp($a[$i], $regex, 1)
   If IsArray($aResult) Then
      If $aResult[0] <> $a[$i + 1] Then ConsoleWriteError("! __" & $a[$i] & "__ - " & $aResult[0] & ' <> ' & $a[$i + 1] & @CRLF)
   Else
      ConsoleWriteError("! __" & $a[$i] & "__ - Chaîne __" & $a[$i + 1] & "__ non trouvée." & @CRLF)
   EndIf
Next

; la chaîne ne doit pas être trouvée
$a = StringRegExp($s, '(?m)^given the string\t(.+?)   assert that regex does not match', 3)
For $i = 0 To UBound($a) - 1
   $aResult = StringRegExp($a[$i], $regex, 1)
   If IsArray($aResult) Then
      ConsoleWriteError("! Chaîne __" & $a[$i] & "__ trouvée." & @CRLF)
   EndIf
Next

; liste des tests unitaires sur regex101.com (liste copiée depuis "unit tests" > "TEST LIST")
#cs
given the string  ;test    assert that    capture group 1   equals   ;test
given the string  $x = 'bb;b'    assert that    regex    does not match
given the string  $x = "&nbsp;" & "bb"           ;;ccc   assert that    capture group 1   equals   ;;ccc
given the string  $x = "a''a;a""a" ; Comment-line  assert that    capture group 1   equals   ; Comment-line
given the string  $x = "&nbsp;" & "bb"    assert that    regex    does not match
given the string  $x = "bb;b"    assert that    regex    does not match
given the string  $x = 'bb;b'    assert that    regex    does not match
given the string  $x = "a" & "b" ; com    assert that    capture group 1   equals   ; com
given the string      ; test  assert that    capture group 1   equals   ; test
given the string   ; test  assert that    capture group 1   equals   ; test
given the string  ; ; ;";'    assert that    capture group 1   equals   ; ; ;";'
given the string  ;;;;  assert that    capture group 1   equals   ;;;;
given the string  $x=" ' ';' "";"" ""' '"" ""'""" ; chaîne 'vide'   assert that    capture group 1   equals   ; chaîne 'vide'
given the string  $x=" ' ';' "";"" ""' '"" ""'""" ; chaîne "vide"   assert that    capture group 1   equals   ; chaîne "vide"
given the string  $x="" ; chaîne "vide"  assert that    capture group 1   equals   ; chaîne "vide"
given the string  $x='' ; chaîne "vide"  assert that    capture group 1   equals   ; chaîne "vide"
given the string  ; 'test"    assert that    capture group 1   equals   ; 'test"
given the string  ; 'test'    assert that    capture group 1   equals   ; 'test'
given the string  ; "test'    assert that    capture group 1   equals   ; "test'
given the string  ; "test"    assert that    capture group 1   equals   ; "test"
given the string  ; test   assert that    capture group 1   equals   ; test
given the string  $x=' '' '';'' ";" "'' ''" "''"' ; chaîne "vide"   assert that capture group 1   equals   ; chaîne "vide"
given the string  $x=' '' '';'' ";" "'' ''" "''"' ; chaîne 'vide'   assert that capture group 1   equals   ; chaîne 'vide'
given the string  $x = "a" ;$x='b'  assert that capture group 1   equals   ;$x='b'
given the string  $x = "aa;aa" ; Comment-line   assert that capture group 1   equals   ; Comment-line
given the string  $x="" ; chaîne 'vide'  assert that capture group 1   equals   ; chaîne 'vide'
#ce
La dernière expression régulière de jchd passe également tous les tests.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Regex for comment-line

#17

Message par mdanielm »

Cette fois c'est ok, solution orax et jchd .
Merci pour le temps passé dessus, mais bon, c'est plus marrant que sudoku!
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Regex for comment-line

#18

Message par jguinch »

@jc : j'ai essayé ta regex sur regex101, mais je crois qu'il y a un petit oubli quelque part (j'ai pas pris le temps de regarder) :
https://regex101.com/r/dP8lY8/1


Euuh, non j'ai rien dit (j'ai recopié bêtement la regex sans faire attention à l'échappement des doubles quotes ...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Regex for comment-line

#19

Message par orax »

jguinch a écrit :Par défaut, si aucun groupe capturant n'est spécifié, AutoIt considère qu'il faut tout capturer
Je pense que c'est pour cette raison que les regex de JGuinch fonctionnent correctement sur regex101, mais que le résultat est différent sur PCRE Toolkit.
En ajoutant un \K je pense que ça pourrait solutionner le problème.

Code : Tout sélectionner

(?:"[^"\r\n]*"|'[^'\r\n]*'|[^;])*\K(;\N+)?

(?:'.*?'|".*?"|[^;'"\r\n])*\K(;\N*)?
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Regex for comment-line

#20

Message par jguinch »

ma dernière regex générait des lignes blanches à juste titre.
J'avais mis (;\N*)?, qui fait que chaque ligne va générer une capture (une chaine vide sera capturer sur les lignes qui ne contiennent pas de commentaire.
Il faut remplacer par ;(\N*)?, qui rend le ";" obligatoire, du coup, à pu les captures vides.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Répondre