Résolu [regex] et case insensitive

Plus d'informations
il y a 1 mois 2 semaines #34187 par Laurent Dardenne
>> 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 :-)
$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')
La chaine "(?i)^lon|^par" semble interprété par le 'moteur' de regex mais pas par dotnet...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine - il y a 1 mois 1 semaine #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"
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 1 mois 1 semaine par Alastor.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine - il y a 1 mois 1 semaine #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
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 1 mois 1 semaine par Gabriel.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine #34193 par Alastor
Réponse de Alastor sur le sujet [regex] et case insensitive
La dernière commande donne le résultat attendu que grâce au '(?i)' de la regex, le imatch n'y change rien !

Un conseil, il vaut mieux rester natif powershell 
Les utilisateur(s) suivant ont remercié: Gabriel

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine - il y a 1 mois 1 semaine #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.
Dernière édition: il y a 1 mois 1 semaine par Gabriel.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.129 secondes
Propulsé par Kunena