Regex for comment-line
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
Regex for comment-line
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!)
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!)
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: Regex for comment-line
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 (
-----
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).
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)
Re: Regex for comment-line
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]
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.
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: Regex for comment-line
https://regex101.com/r/jS5bK7/3
Il faut quand même vérifier qu'elle fonctionne correctement.
Code : Tout sélectionner
(?xm)^
(?:|
[^;"'\r\n]*
(?:
(?:'[^'\r\n]*')|
(?:"[^"\r\n]*")
)*
)
\h*\K
(;[^\r\n]*)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Re: Regex for comment-line
Un poil plus court peut-être :
https://regex101.com/r/jS5bK7/4
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 !
Re: Regex for comment-line
Merci pour vos indications.
Je pense tenir maintenant un algorithme pour colorer du code au3.
Je pense tenir maintenant un algorithme pour colorer du code au3.
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: Regex for comment-line
Non, ce n'est pas nécessaire. D'ailleurs, je l'avais supprimé sur regex101.com.\K # Réinitialise la recherche à cet endroit. Utile?
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Re: Regex for comment-line
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.
Essaie avec:
$x = 'bb;b'
$x = "bb;b"
$x = " " & "bb"
Testé avec PCRE Toolkit.
- jchd
- 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
Et ça, ça irait ?
Code : Tout sélectionner
(?|[^";]*"[^"]*+"|[^';]*'[^']*+')*+[^"';]*(;.*)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Re: Regex for comment-line
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
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
Re: Regex for comment-line
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 !
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: Regex for comment-line
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)
Re: Regex for comment-line
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 !
Re: Regex for comment-line
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] =
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] =
- jchd
- 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
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é.
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: Regex for comment-line
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.
La dernière expression régulière de jchd passe également tous les tests.
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 = " " & "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 = " " & "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
$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 = " " & "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 = " " & "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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Re: Regex for comment-line
Cette fois c'est ok, solution orax et jchd .
Merci pour le temps passé dessus, mais bon, c'est plus marrant que sudoku!
Merci pour le temps passé dessus, mais bon, c'est plus marrant que sudoku!
Re: Regex for comment-line
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 !
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: Regex for comment-line
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.jguinch a écrit :Par défaut, si aucun groupe capturant n'est spécifié, AutoIt considère qu'il faut tout capturer
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)
Re: Regex for comment-line
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.
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 !