Re: Règle des signes
Posté : ven. 22 mai 2020 09:21
J'ai fait ça:
On pourrait même se passer du paramètre $nbGroupes en le calculant. Il faudrait trouver une regex qui calcule le nombre de groupes capturés dans $regex!!!
Par exemple:
; StringRegExpReplaceEx
Ex1()
Ex2()
func Ex1()
; Remplace "basic" ou "Basic" par "BASIC"
; Utilise la fonction interne StringUpper
$in = "basic xxx Basic xxxxx BASic." & @crlf & _
"xxxbasica basIC xxx."
$regex = "(?i)\bbasic\b"
$in = StringRegExpReplaceEx($in, $regex, "StringUpper")
ConsoleWrite($in & @crlf)
EndFunc
func Ex2()
; Remplace une minuscule en début de phrase par une majuscule
; et réduit les espaces qui précèdent à un seul
$in = " le. corbeau. et. le. renard."
$regex = "(^|\.) *?([a-z])"
$in = StringRegExpReplaceEx($in, $regex, "UpCase",2)
ConsoleWrite($in & @crlf)
EndFunc
func UpCase($ch0, $ch1, $ch2)
; 2 groupes capturés donc 3 paramètres avec $0
; $ch0 - match complet non utilisé
; $ch1 - un point ou rien: groupe capturé \1
; $ch2 - une minuscule : groupe capturé \2
Return $ch1 & ($ch1="" ? @tab : " ") & StringUpper(StringRight($ch2,2))
EndFunc
func StringRegExpReplaceEx($in, $regex, $fonc, $nbGroupes=0)
; $in - chaîne d'entrée
; $regex - critère de recherche avec groupe(s) de capture
; $fonc - nom de la fonction de traitement des groupes de capture
; $nbGroupes - 0..9 nb de groupes capturées
Local $replace="' & " & $fonc & "(""$0"") & '"
for $i=1 to $nbGroupes
$replace=StringReplace($replace,'")', '","$' & $i & '")')
Next
Return Execute("'" & StringRegExpReplace($in, $regex, $replace) & "'")
EndFunc
Ex1()
Ex2()
func Ex1()
; Remplace "basic" ou "Basic" par "BASIC"
; Utilise la fonction interne StringUpper
$in = "basic xxx Basic xxxxx BASic." & @crlf & _
"xxxbasica basIC xxx."
$regex = "(?i)\bbasic\b"
$in = StringRegExpReplaceEx($in, $regex, "StringUpper")
ConsoleWrite($in & @crlf)
EndFunc
func Ex2()
; Remplace une minuscule en début de phrase par une majuscule
; et réduit les espaces qui précèdent à un seul
$in = " le. corbeau. et. le. renard."
$regex = "(^|\.) *?([a-z])"
$in = StringRegExpReplaceEx($in, $regex, "UpCase",2)
ConsoleWrite($in & @crlf)
EndFunc
func UpCase($ch0, $ch1, $ch2)
; 2 groupes capturés donc 3 paramètres avec $0
; $ch0 - match complet non utilisé
; $ch1 - un point ou rien: groupe capturé \1
; $ch2 - une minuscule : groupe capturé \2
Return $ch1 & ($ch1="" ? @tab : " ") & StringUpper(StringRight($ch2,2))
EndFunc
func StringRegExpReplaceEx($in, $regex, $fonc, $nbGroupes=0)
; $in - chaîne d'entrée
; $regex - critère de recherche avec groupe(s) de capture
; $fonc - nom de la fonction de traitement des groupes de capture
; $nbGroupes - 0..9 nb de groupes capturées
Local $replace="' & " & $fonc & "(""$0"") & '"
for $i=1 to $nbGroupes
$replace=StringReplace($replace,'")', '","$' & $i & '")')
Next
Return Execute("'" & StringRegExpReplace($in, $regex, $replace) & "'")
EndFunc
Par exemple:
$in="(abc(?:def)gh((?:ijkl)mn))"
stringreplace(stringreplace($in, "(?", ""), '(', '')
ConsoleWrite("Nb de groupes numérotés: " & @extended & @crlf)
stringreplace(stringreplace($in, "(?", ""), '(', '')
ConsoleWrite("Nb de groupes numérotés: " & @extended & @crlf)