Partager via


Hé, vous le scripteur !Pas d'erreur, c'est une expression régulière

Les scripteurs Microsoft

Télécharger le code de cet article: HeyScriptingGuy2008_01.exe (150KB)

Tout le monde commet des erreurs.(Vous pensiez vraiment que l'équipe des scripteurs avait été créée exprès ?)Cependant, si l'ont peut dire quelque chose de positif à propos des erreurs, c'est... heu qu'est-ce que c'est ?Vous pensiez que nous dirions que la seule chose positive à propos des erreurs est que vous pouvez toujours apprendre de ces erreurs ?Absolument pas :la seule chose que vous pouvez apprendre d'une erreur est qu'il aurait été préférable de ne l'avoir jamais commise.

Remarque :Désolé, pas de plaisanterie sur Microsoft Bob, pas aujourd'hui.Nous avons commis l'erreur de nous moquer de Microsoft Bob précédemment et, dans ce cas, nous avons appris de notre erreur.Quand il s'agit de Microsoft Bob, nos lèvres sont scellées.

Pour être honnête, les scripteurs ne voient vraiment aucun aspect positif aux erreurs. C'est pourquoi nous avons consacré nos vies à réduire nos erreurs.(Il est vrai que le seul moyen de les réduire était de réduire le nombre de choses que nous faisons. Mais cela est une autre histoire).

Maintenant, c'est bien joli que nous ayons essayé de réduire nos propres erreurs, mais cela n'a aucun intérêt si les personnes avec lesquelles nous travaillons continuent de commettre des erreurs.(Non, nous vous l'avons déjà dit :pas de plaisanterie sur Microsoft Bob !)Si vous avez déjà écrit un élément frontal, par exemple, d'un programme de base de données ou d'Active Directory® (et nous savons que c'est le cas de beaucoup d'entre vous), vous voyez exactement de quoi nous parlons :votre programme frontal de saisie de données n'est efficace qu'à la mesure des personnes qui effectuent la saisie des données.

Supposons que vous vouliez que les prénoms soient entrés comme ceci :Ken, avec une première lettre majuscule et toutes les lettres suivantes en minuscules.Qu'arrive-t-il lorsqu'un utilisateur entre ce nom comme ceci :KEN ?Supposons que les dates sont entrées comme ceci :01/23/2007. Qu'arrive-t-il lorsqu'un utilisateur entre une date comme ceci :23 janvier 2007 ?Supposons..., enfin vous voyez ce que nous voulons dire.Comme nous l'avons dit, votre programme frontal d'entrée de saisie de données n'est efficace qu'à la mesure des personnes qui effectuent la saisie.Et que cela vous plaise ou non, les personnes qui effectuent la saisie des données commettent des erreurs.À moins, bien sûr, que vous preniez des mesures pour vous assurer qu'elles n'en feront pas.

S'assurer que les données sont valides

Attendons la fin des Jeux

Vous êtes vous jamais demandé quel est l'événement que les scripteurs attendent toute l'année ?Si vous êtes allé au Centre de scripts en février au cours de l'une des deux dernières années, vous pourriez penser que cet événement est « Les Jeux de script d'hiver ».Hé bien, vous auriez tort.Les scripteurs attendent la fin des Jeux de script, lorsque, après deux semaines d'amusement et d'agitation incessants, les scripteurs se préparent à savourer la réussite d'une nouvelle édition des Jeux de script et à dormir pendant un mois.

Donc, en préparation de notre événement préféré de l'année, la fin des Jeux de script, il est temps de lancer les Jeux de script d'hiver 2008 !Rejoignez-nous du 15 février au 3 mars 2008 au Centre de scripts pour plus de deux semaines de jeux de script et la meilleure compétition de script au monde.

Les Jeux de script sont un bon moyen de tester et d'améliorer vos compétences.Et comme cette année les Scripteurs veulent dormir quelques jours de plus après la fin de la compétition, nous faisons tout pour que la compétition de cette année soit encore plus grandiose et plus réussie que l'année dernière !Une fois encore, nous aurons deux catégories :Débutant et Avancé.Cela signifie que si vous êtes novice en matière de script, professionnel grisonnant (ou jeune et fringant), ou quelque part au milieu, cette compétition est pour vous.

Alors, quelles sont les nouveautés de cette année ?Nous ajoutons encore un autre langage de script.Vous pouvez participer à la compétition en VBScript, Windows PowerShell ou, voilà la nouveauté, Perl.(Nous savons que Perl n'est pas nouveau, mais c'est nouveau dans cette compétition).Il y aura probablement d'autres nouveautés, mais puisque nous avons dû rédiger cet encadré il y a plusieurs mois, nous ne savons pas ce que ce sera.Il vous faudra visiter le Centre de scripts pour découvrir ce que nous proposons.

Si vous vous posez la question, oui, il y aura des prix !Que seront-ils ?Allez, nous ne gâchons pas la surprise ici, venez au Centre de scripts la découvrir ! Microsoft.com/technet/scriptcenter/funzone/games/default.mspx.

Beaucoup d'entre vous ont probablement déjà effectué une validation d'entrée des données rudimentaire.Pour l'essentiel, cette validation d'entrée de données simple est souvent tout à fait suffisante.Vous voulez vous assurer que la valeur de chaîne strName comporte 20 caractères au maximum ?Ce petit bloc de code fera l'affaire :

If Len(strName) > 20 Then
    Wscript.Echo "Invalid name; a " & _
    "name must have 20 or fewer characters."
End If

Mais supposons que strName est un nouveau numéro de référence et que les numéros de référence doivent respecter un modèle spécifié :quatre chiffres suivis de deux lettres majuscules (par exemple 1234AB).Avec le VBScript nature, pouvez-vous vérifier que strName suit le modèle requis pour les numéros de référence ?Oui, vous pouvez.Mais faites-nous confiance, vous ne voulez pas.Au lieu de cela, il vaut mieux utiliser une expression régulière.

S'assurer que seuls des chiffres apparaissent dans une valeur

Les expressions régulières datent des années 1950, époque à laquelle ils ont d'abord été décrits sous la forme de notation mathématique.Dans les années 1960, ce modèle mathématique a été intégré à l'éditeur de texte QED comme moyen de rechercher des modèles de caractères dans un fichier de texte.Quelque temps après... qu'y a-t-il ?Oh.Apparemment tout le monde ne trouve pas l'historique des expressions régulières aussi fascinant que nous. Pas de problème.Dans ce cas, nous nous contenterons de vous expliquer ce dont nous parlons.

Vous voulez vous assurer qu'une variable (en l'occurrence, la variable strSearchString) contient uniquement des chiffres ?La figure 1 présente une façon de faire cela.

Figure 1 Des chiffres, rien que des chiffres

Set objRegEx = _
  CreateObject("VBScript.RegExp")

objRegEx.Global = True   
objRegEx.Pattern = "\D"

strSearchString = "353627"

Set colMatches = _
  objRegEx.Execute(strSearchString)  

If colMatches.Count > 0 Then
    Wscript.Echo "Invalid: a " & _
      "non-numeric character was found."
Else
    Wscript.Echo "This is a valid entry."
End If

Comme vous pouvez le voir, le script démarre en créant une instance de l'objet VBScript.RegExp, l'objet qui... absolument, vous avez tout à fait raison, l'objet qui nous permet d'utiliser des expressions régulières dans notre script.(Oh, nous voulions expliquer cela nous-mêmes).Ensuite, nous attribuons des valeurs à deux propriétés clés de l'objet des expressions régulières :Global et Pattern.

La propriété Global détermine si le script doit correspondre à toutes les occurrences d'un modèle ou doit simplement rechercher la première occurrence puis s'arrêter.En général, il est préférable de définir cette valeur sur True, ce qui signifie que vous voulez rechercher toutes les occurrences d'un modèle.(La valeur par défaut est False.)La plupart du temps, vous voudrez rechercher toutes les occurrences d'un modèle.Même si vous ne le faites pas, le seul avantage de rechercher uniquement la première occurrence d'un modèle réside dans le fait que le script s'exécutera plus rapidement s'il s'arrête au milieu de la chaîne au lieu d'effectuer la recherche d'un bout à l'autre de celle-ci.En théorie, cela paraît bien.Dans la pratique, cependant, la recherche se termine généralement si rapidement que vous ne remarquerez pas beaucoup de différence.

Voici la partie intéressante :le Pattern est l'endroit où nous spécifions les caractères (et le modèle de caractère) qui nous intéressent. Dans notre exemple de script, nous cherchons tous les caractères qui ne sont pas des chiffres de 0 à 9. Si nous trouvons un de ces caractères (une lettre, un signe de ponctuation, etc.), nous savons que la valeur attribuée à strSearchString n'est pas valide.Avec les expressions régulières, la syntaxe \D est utilisée pour rechercher un caractère non-chiffre. Ainsi nous attribuons la valeur \D à la propriété Pattern.

Remarque :Comment savions nous que \D correspond à un caractère non-chiffre ?Eh bien, un long historique se cache derrière cela.Voyez-vous, il y plusieurs années... bon d'accord.Nous avons recherché cela sur MSDN® dans la référence sur le langage VBScript, à l'adresse msdn2.microsoft.com/1400241x.

Après avoir attribué des valeurs aux propriétés Global et Pattern, l'étape suivante consiste à attribuer une valeur à la variable strSearchString :

strSearchString = "353627"

Comment savons-nous si cette chaîne contient des caractères non-chiffre ?C’est simple :il suffit d'appeler la méthode Execute qui recherche notre variable pour les caractères non-chiffre :

Set colMatches = _
objRegEx.Execute(strSearchString)

Lorsque vous appelez la méthode Execute, toutes les correspondances, c'est à dire toutes les instances de Pattern trouvées sont automatiquement enregistrées dans la collection Matches.(Dans notre exemple de script, nous avons nommé cette collection colMatches).Si nous voulons savoir si notre variable contient des caractères non-chiffre (et nous le voulons), il nous suffit maintenant de vérifier la valeur de la propriété Count de la collection, qui nous indique combien d'articles se trouvent dans la collection :

If colMatches.Count > 0 Then
    Wscript.Echo "Invalid: a " & _
      "non-numeric character was found."
Else
    Wscript.Echo "This is a valid entry."
End If

Si Count est supérieur à 0, cela ne peut signifier qu'une seule chose :Un caractère non-chiffre a été trouvé quelque part dans la valeur variable.(Si tous les caractères de la valeur étaient des chiffres, la collection serait vide et Count aurait la valeur 0.)Dans notre exemple de script, nous renvoyons ensuite le fait qu'un caractère non numérique a été découvert.Dans une base de données frontale ou un script frontal opérationnel, vous auriez probablement renvoyé un message similaire et effectué une boucle pour que l'utilisateur essaie à nouveau.Mais nous vous laissons vous occuper de cela. En tant que Scripteurs, nous avons beaucoup d'autres sujets de préoccupations.

Comme quoi ?Comme la pensée qu'un jour, les gens de Technet Magazine pourraient commencer à vraiment lire les articles que nous leur envoyons tous les mois.Nous préférerions qu'ils n'apprennent pas de leurs erreurs.

Ah, bonne question :ne pourrions-nous pas simplement utiliser la fonction IsNumeric pour déterminer si strSearchString contient un chiffre ?Bien sûr, à condition que strSearchString puisse être n'importe quel nombre.Mais qu'en est-il si strSearchString doit être un nombre entier positif ?Cela pourrait être un problème. car IsNumeric identifie ces deux valeurs comme des nombres valides :

-45
672.69

Pourquoi ces valeurs sont-elles identifiées comme des nombres valides ?Parce que ce sont des nombres valides. Simplement, il ne s'agit pas de nombres entiers.Toutefois, notre expression régulière marquera ces valeurs comme des entrées non valides car l'expression régulière intercepte les caractères non-chiffre signe moins (–) et point (.).Si vous avez lu cet article en pensant, « Mais pourquoi suis-je en train de lire cet article ? » hé bien, voilà une très bonne raison.

Qu'avez-vous dit ?Cela n'est pas suffisant ?Vous êtes bien exigeants ce mois-ci.Examinons quelques autres types de validation d'entrée de données que l'on peut effectuer à l'aide d'expressions régulières.

S'assurer qu'aucun chiffre n'apparaît dans une valeur

Nous venons de vous expliquer comment vous assurer que seuls des chiffres apparaissent dans une valeur.Qu'en est-il si nous voulons faire le contraire, si nous voulons nous assurer qu'aucun chiffre n'apparaît dans notre valeur ?Hé bien, voici un modèle de recherche que nous pouvons utiliser :

objRegEx.Pattern = "[0-9]"

Que se passe-t-il ici ?Dans le monde farfelu des expressions régulières, les caractères crochet ([ et ]) vous permettent de spécifier une série de caractères ou, comme nous l'avons fait ici, une plage de caractères.Que signifie Pattern [0-9] ?Cela signifie que nous recherchons les caractères de la plage 0 à 9, autrement dit, n'importe quelle valeur numérique.Si nous voulions uniquement les chiffres pairs (c'est à dire, si nous voulions nous assurer que notre valeur n'inclut pas de 1, 3, 5, 7 ou 9), nous utiliserions ce modèle :

objRegEx.Pattern = "[13579]"

Notez que puisque nous n'avons pas utilisé de trait d'union, nous ne recherchons pas une plage de caractères.En fait, nous recherchons les caractères 1, 3, 5, 7 et 9, spécifiquement.

Bien sûr, le modèle [0-9] recherche uniquement les chiffres. Il ne trouvera pas les signes de ponctuation ou d'autres caractères qui ne sont pas des lettres mais ne sont pas des chiffres non plus.Pensez-vous que nous pouvons créer un modèle qui recherche des caractères non-lettre ?Bien sûr que nous pouvons.Vous pouvez faire pratiquement tout ce que vous voulez avec les expressions régulières :

objRegEx.Pattern = "[^A-Z][^a-z]"

Dans ce cas-ci, nous combinons deux critères dans notre modèle :Nous recherchons [^A-Z] et [^a-z].Comme vous l'avez sans doute compris, A-Z représente la plage de caractères de A majuscule à Z majuscule. Que signifie le caractère ^ ?Lorsqu'il est placé entre crochets, le ^ signifie, « Rechercher les caractères qui n'appartiennent pas à ce jeu de caractères ».Ainsi, [^A-Z] signifie, « Rechercher les caractères non majuscules ».Alors que [^a-z] signifie, « Rechercher les caractères non minuscules ».Le résultat ?Ce modèle signifie que nous recherchons des caractères qui ne sont ni des lettres majuscules, ni des lettres minuscules.Cela inclut les chiffres, les signes de ponctuation et d'autres caractères bizarres qui se trouvent sur votre clavier.

Nous aurions également pu définir la propriété IgnoreCase sur True :

objRegEx.IgnoreCase = True

En faisant cela, notre recherche ignorerait la casse des lettres.Nous pourrions utiliser ce Pattern, qui, combiné avec la propriété IgnoreCase, rechercherait les caractères qui ne sont ni des lettres majuscules ni des lettres minuscules :

objRegEx.Pattern = "[^A-Z]"

S'assurer qu'un numéro de référence est valide

Allons maintenant un peu plus loin.(Faites-nous confiance, vous pouvez vraiment aller plus loin avec les expressions régulières. Consultez le site Web regexlib.com pour certains exemples).Plus haut dans cet article, nous avons dit quelque chose comme ceci :Supposons que strName est un nouveau numéro de référence et que les numéros de référence doivent respecter un modèle spécifié :quatre chiffres suivis de deux lettres majuscules (par exemple 1234AB).Comment pouvez-vous vérifier qu'une variable correspond à ce modèle ?Mais enfin, comme ceci, bien sûr :

objRegEx.Pattern = "^\d{4}[A-Z]{2}"

Que signifie ce modèle ?Quelle coïncidence :nous étions sur le point d'expliquer ce que ce modèle signifie.Dans ce cas-ci, nous recherchons trois critères :

^\d{4} 

Le \d signifie que nous recherchons des chiffres (un caractère dans la plage 0 à 9).Que signifie {4} ?Cela signifie que nous voulons trouver exactement quatre caractères (c'est à dire, exactement quatre chiffres).Ainsi nous recherchons quatre chiffres consécutifs.

Qu'en est-il du caractère^ ?Hors des crochets, le ^ indique que la valeur doit commencer par le modèle suivant. Cela signifie qu’AA1234AB ne serait pas marqué comme une correspondance.(Pourquoi ?Parce que cette valeur commence par AA, pas par quatre chiffres consécutifs).Si nous le voulions, nous pourrions utiliser le caractère $ pour indiquer que la correspondance doit survenir à la fin de la chaîne.Mais nous ne le voulons pas.(Du moins pas avec cet exemple).

[A-Z]{2} 

Vous savez déjà ce que signifie le composant [A-Z], il s'agit de n'importe quelle lettre majuscule.Et le {2} ?Vous l'avez deviné :les quatre chiffres doivent être suivis par exactement deux caractères majuscules.

Assez facile, non ?À propos, dans le cas qui nous occupe, si Count a la valeur 0, nous avons une valeur non valide.Pourquoi ?Parce que cette fois, nous ne recherchons pas un caractère unique qui invaliderait la chaîne, mais nous recherchons une correspondance exacte du modèle.Si nous n'obtenons pas cette correspondance, cela signifie que nous avons une valeur non valide.Cela signifie également que la propriété Count de la collection sera 0.

Remarque :Les deux constructions suivantes sont des constructions utiles :{3,} et {3,7}.Le {3,} signifie qu'il doit y avoir au moins 3 caractères consécutifs (ou expressions), mais bien qu'il y ait un minimum de 3, il n'y a pas de maximum.Ce \d{3,} correspond à 123, il correspond à 1234, et il correspond également à 123456789. Le {3,7} signifie qu'il doit y avoir au moins 3 caractères consécutifs (ou expressions) mais pas plus de 7. Ainsi, 123456 est une correspondance, mais 123456789 (qui a plus de 7 chiffres consécutifs) n'est pas une correspondance.

Voici un autre modèle utile.Supposons que votre numéro de référence commence par 4 chiffres suivis des lettres US suivies de deux caractères finaux (qui peuvent être des lettres, des chiffres ou quoi que ce soit).Voici un moyen d'obtenir une correspondance :

objRegEx.Pattern = "^\d{4}US.."

Comme vous pouvez le voir, ce motif commence par quatre chiffres (\d), qui doivent être suivis des caractères US (et seulement des caractères US, aucune autre correspondance ne sera possible).Après les caractères US, nous avons ensuite besoin de deux autres caractères.Comment faut-il indiquer un caractère quelconque dans une expression régulière ?Attendez une seconde, nous le savons ça... ha oui voilà :un caractère quelconque seul est indiqué par un point (.).Assez logiquement, cela signifie que deux caractères peuvent être indiqués par deux points :

..

Bon d'accord, c'était facile.Essayons quelque chose de plus difficile.Supposons que ces deux caractères internes indiquent le pays où la pièce a été fabriquée.Si vous avez des usines de fabrication aux États-Unis, au Royaume-Uni et en Espagne, cela signifie que tous ces codes à deux caractères sont valides :US, UK, ES.Comment diable pouvons-nous faire des choix multiples dans une expression régulière ?

Que pensez-vous de ceci :

objRegEx.Pattern = "^\d{4}(US|UK|ES).."

La clé ici est cette petite construction :(US|UK|ES).Nous avons placé les trois valeurs acceptables (US, UK et ES) entre parenthèses, en séparant chaque valeur par le caractère de barre verticale (|).C'est comme cela que les choix multiples sont indiqués dans une expression régulière.

Mais attendez :n'avions nous pas dit que vous pourriez placer plusieurs options entre crochets ?L'exemple [13579] ne servait-il pas à cela ?Si, absolument.Cependant, cette notation fonctionne seulement pour les caractères uniques ; [13579] sera toujours interprété comme 1, 3, 5, 7 et 9. Pour utiliser 135 et 79 comme choix, vous devez utiliser cette syntaxe :(135|79). Vous pouvez également utiliser des parenthèses pour définir un mot unique à rechercher :

objRegEx.Pattern = "(scripting)"

Ou ne pas mettre de parenthèses :

objRegEx.Pattern = "scripting"

Remarque :D'accord, c'est bon à savoir mais qu'en est-il si les parenthèses doivent faire partie du terme de recherche, c'est-à-dire, qu'en est-il si je veux rechercher (écrire le script) ?Hé bien, comme les parenthèses d'ouverture et de fermeture sont des caractères réservés dans les expressions régulières, vous devez faire précéder chaque caractère d'un \.En d'autres termes :

objRegEx.Pattern = "\(scripting\)"

Liberté d'expression

Nous n'avons pas le temps d'en dire plus ce mois-ci.Si vous souhaitez en apprendre plus sur les expressions régulières, vous pouvez jeter un coup d'œil au webcast Théorie de chaînes pour les administrateurs système :Introduction aux expressions régulières (microsoft.com/technet/scriptcenter/webcasts/archive.mspx).Et lorsque vous commencerez à apprendre, et à utiliser, les expressions régulières, n'oubliez pas les paroles immortelles de Sophia Loren :« Les erreurs font partie du tribut à payer pour une vie bien remplie ».

Remarquable !Les Scripteurs ont eu des vies bien plus remplies que nous ne pensons !

Les scripts embrouillés du Dr. Scripto

Le défi mensuel qui teste non seulement vos compétences à résoudre les énigmes, mais également vos compétences à écrire des scripts.

Janvier 2008 :Noms cachés

Ce mois-ci, Dr. Scripto a décidé de travailler avec Windows PowerShell.Bien sûr, vous ne pouvez pas travailler avec Windows PowerShell, si vous l'utilisez bien du moins (et Dr. Scripto fait toujours tout bien), sans utiliser les applets de commande.Pour cette énigme, Dr. Scripto a placé des applets de commande sur une grille et vous devez les découvrir.

Bon, nous devons admettre que cette énigme serait un peu plus compliquée si nous devions utiliser toute l'applet de commande.Du fait la construction verbe-substantif des applets de commande, il y en a des dizaines qui commencent par Get-, Set-, etc.Donc nous avons enlevé la partie verbe de l'applet de commande (et le trait d'union), en laissant seulement les noms.(Mais nous pouvons vous dire que tous les verbes étaient « Get- ».)

Votre tâche du mois est de découvrir les noms d'applet de commande.Nous vous avons fourni la liste des noms masqués dans l'énigme.(Nous sommes généreux, n'est-ce pas ?)Chaque mot peut être lu verticalement et horizontalement, en avant et en arrière, mais jamais en diagonale.Nous vous avons donné le premier mot (Location) comme exemple.Bonne chance !

Liste des mots

Alias
ChildItem
Credential
Date
EventLog
ExecutionPolicy
Location
Member
PSSnapin
TraceSource
Unique
Variable
WMIObject

ANSWER:

Les scripts embrouillés du Dr. Scripto

Réponse :Noms cachés, janvier 2008

Les scripteurs Microsofttravaillent pour (enfin, sont employés par) Microsoft.Lorsqu’ils ne sont pas en train de jouer au base-ball, d’entraîner une équipe ou de regarder un match (ou de se livrer à de multiples autres activités), ils dirigent le Script Center TechNet.Vous pouvez le vérifier vous-même sur www.scriptingguys.com.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.