Résolu [regex] et case insensitive
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 5 mois 3 semaines #34187
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet [regex] et case insensitive
>> Je pense que le type RegEx doit être plus strict que le type String lorsqu'on les associe avec l'opérateur Match
Selon ceci , dans ce cas le parseur 'réécrit l'appel' en modifiant les options d'un nouvel objet regex.
Conclusion :pour la maintenance il est préférable d'utiliser une string et l'opérateur -Match ou une [regex], mais pas les deux
Seul ce code modifie l'option de la regex :La chaine "(?i)^lon|^par" semble interprété par le 'moteur' de regex mais pas par dotnet...
Selon ceci , dans ce cas le parseur 'réécrit l'appel' en modifiant les options d'un nouvel objet regex.
Conclusion :pour la maintenance il est préférable d'utiliser une string et l'opérateur -Match ou une [regex], mais pas les deux
$s=@('paratonnerre','palet','long','loin','Longtemps','Paris')
[string]$filtre="^lon|^par"
$s | where {$_ -match "^lon|^par"}
#paratonnerre
#long
#Longtemps
#Paris
[regex]$filtre="^lon|^par"
$s | where {$_ -match $filtre}
#paratonnerre
#long
$filtre.options
#None
[system.enum]::GetValues([System.Text.RegularExpressions.RegexOptions])
#None
#IgnoreCase
#Multiline
#ExplicitCapture
#Compiled
#Singleline
#IgnorePatternWhitespace
#RightToLeft
#ECMAScript
#CultureInvariant
[regex]$filtre="(?i)^lon|^par"
$s | where {$_ -match $filtre}
#paratonnerre
#long
#Longtemps
#Paris
Seul ce code modifie l'option de la regex :
$filtre=[regex]::new("^lon|^par",'IgnoreCase')
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Alastor
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 35
- Remerciements reçus 1
il y a 5 mois 2 semaines - il y a 5 mois 2 semaines #34189
par Alastor
Réponse de Alastor sur le sujet [regex] et case insensitive
En fait, ma première réponse était visiblement la bonne.
La classe String n'a pas de méthode "match"
Donc lorsque l'on fait
On fait appel à l'opérateur -match de Powershell, et Powershell n'est pas Case Sensitive par défaut, donc l'implémentation des Regex intégré à Powershell n'est pas case sensitive par défaut.
Par contre, la classe Regex elle, à une méthode "match"
Du coup, lorsque l'on fait :
Comme Pöwershell est un langage objet jusqu'au bout des ongles (et c'est tant mieux), il fait ici appel à la méthode Match de la classe Regex.
Or, la classe RegEx vient de .Net et .Net implémente les RegEx conforme Perl 5, et les regex Perl 5 sont Case Sensitive, donc l'implémentation conforme Perl des RegEx en .Net se doit de l'être également.
CQFD.
Lire ceci pour l'implémentation Perl 5 , et ça pour les différences Powershell vs Perle sur les Regex
La classe String n'a pas de méthode "match"
PS C:\Users\user> [string] | Get-Member -Static
TypeName : System.String
Name MemberType Definition
---- ---------- ----------
Compare Method static int Compare(string strA, string strB)...
CompareOrdinal Method static int CompareOrdinal(string strA, string strB)...
Concat Method static string Concat(System.Object arg0)...
Copy Method static string Copy(string str)
Equals Method static bool Equals(string a, string b)...
Format Method static string Format(string format, System.Object arg0)...
Intern Method static string Intern(string str)
IsInterned Method static string IsInterned(string str)
IsNullOrEmpty Method static bool IsNullOrEmpty(string value)
IsNullOrWhiteSpace Method static bool IsNullOrWhiteSpace(string value)
Join Method static string Join(string separator, Params string value)...
new Method string new(System.Char*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 value)...
ReferenceEquals Method static bool ReferenceEquals(System.Object objA, System.Object objB)
Empty Property static string Empty {get;}
Donc lorsque l'on fait
> "MaValeur" -match [string]'ma'
True
On fait appel à l'opérateur -match de Powershell, et Powershell n'est pas Case Sensitive par défaut, donc l'implémentation des Regex intégré à Powershell n'est pas case sensitive par défaut.
Par contre, la classe Regex elle, à une méthode "match"
PS C:\Users\user> [regex] | Get-Member -Static
TypeName : System.Text.RegularExpressions.Regex
Name MemberType Definition
---- ---------- ----------
CompileToAssembly Method static void CompileToAssembly(System.Text.RegularExpressions.RegexCompilationInfo regexinfos...
Equals Method static bool Equals(System.Object objA, System.Object objB)
Escape Method static string Escape(string str)
IsMatch Method static bool IsMatch(string input, string pattern, System.Text.RegularExpressions.RegexOptions...
Match Method static System.Text.RegularExpressions.Match Match(string input, string pattern, System.Text.RegularExpressions.RegexOptions options), static System.Text.RegularExpressions.M...
Matches Method static System.Text.RegularExpressions.MatchCollection Matches(string input, string pattern)...
new Method regex new(string pattern), regex new(string pattern, System.Text.RegularExpressions....
ReferenceEquals Method static bool ReferenceEquals(System.Object objA, System.Object objB)
Replace Method static string Replace(string input, string pattern, string replacement)...
Split Method static string Split(string input, string pattern), static string Split...
Unescape Method static string Unescape(string str)
CacheSize Property static int CacheSize {get;set;}
InfiniteMatchTimeout Property static timespan InfiniteMatchTimeout {get;}
Du coup, lorsque l'on fait :
> "MaValeur" -match [regex]'ma'
False
Comme Pöwershell est un langage objet jusqu'au bout des ongles (et c'est tant mieux), il fait ici appel à la méthode Match de la classe Regex.
Or, la classe RegEx vient de .Net et .Net implémente les RegEx conforme Perl 5, et les regex Perl 5 sont Case Sensitive, donc l'implémentation conforme Perl des RegEx en .Net se doit de l'être également.
CQFD.
Lire ceci pour l'implémentation Perl 5 , et ça pour les différences Powershell vs Perle sur les Regex
Dernière édition: il y a 5 mois 2 semaines par Alastor.
Connexion ou Créer un compte pour participer à la conversation.
- Gabriel
- Auteur du sujet
- Hors Ligne
- Membre elite
Réduire
Plus d'informations
- Messages : 248
- Remerciements reçus 1
il y a 5 mois 2 semaines - il y a 5 mois 2 semaines #34190
par Gabriel
Réponse de Gabriel sur le sujet [regex] et case insensitive
Donc en resumé:
si on utilise un objet string (meme si cette string est une regex) avec -match c'est pas case sensitive et si on veut que ce soit case sensitive il faut jouer sur le -match/-cmatch
si on utilise l'objet [regex] avec -match il faut agir DANS la regex pour le case sensitive
merci pour vos lumirères!
[corrected]
si on utilise un objet string (meme si cette string est une regex) avec -match c'est pas case sensitive et si on veut que ce soit case sensitive il faut jouer sur le -match/-cmatch
PS C:\> "MaValeur" -match [string]'^ma'
True
PS C:\> "MaValeur" -cmatch [string]'^ma'
False
si on utilise l'objet [regex] avec -match il faut agir DANS la regex pour le case sensitive
PS C:\> "MaValeur" -match [regex]'^ma'
False
PS C:\> "MaValeur" -cmatch [regex]'^ma'
False
PS C:\> "MaValeur" -match [regex]'(?i)^ma'
True
merci pour vos lumirères!
[corrected]
"MaValeur" [color=#e74c3c][b]-imatch[/b][/color] [regex]'(?i)^ma' -> "MaValeur" [b][color=#27ae60]-match[/color][/b] [regex]'(?i)^ma'
Dernière édition: il y a 5 mois 2 semaines par Gabriel.
Connexion ou Créer un compte pour participer à la conversation.
- Alastor
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 35
- Remerciements reçus 1
il y a 5 mois 2 semaines #34193
par Alastor
Réponse de Alastor sur le sujet [regex] et case insensitive
Les utilisateur(s) suivant ont remercié: Gabriel
Connexion ou Créer un compte pour participer à la conversation.
- Gabriel
- Auteur du sujet
- Hors Ligne
- Membre elite
Réduire
Plus d'informations
- Messages : 248
- Remerciements reçus 1
il y a 5 mois 2 semaines - il y a 5 mois 2 semaines #34196
par Gabriel
Réponse de Gabriel sur le sujet [regex] et case insensitive
alors
- dans ma petite tete il y a vait pas le "-imatch"
- dans mon test il y apas le "-imatch"
- mais dans le copier coller sur le forum... le "-imatch" a pris la place .... au lieu du "-match"....
merci pour la correction.
- dans ma petite tete il y a vait pas le "-imatch"
- dans mon test il y apas le "-imatch"
- mais dans le copier coller sur le forum... le "-imatch" a pris la place .... au lieu du "-match"....
merci pour la correction.
Dernière édition: il y a 5 mois 2 semaines par Gabriel.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.115 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- [regex] et case insensitive