Windows PowerShell

Arguments en faveur des expressions régulières

Don Jones

Dans le passé, vous avez écrit sur les expressions régulières dans Windows PowerShell, surtout du point de vue de leur fonctionnement et la façon dont vous pouvez les utiliser. Ce mois-ci, je suis concentre sur une application réelle, pratique des expressions régulières dans le shell. Basé sur une solution de client que j'ai créé, il s'agit d'un excellent exemple de puissance des expressions régulières ’.

Un problème régulière

Le problème s'est passé quelque chose comme ceci : J'avais besoin d'utiliser Windows PowerShell pour extraire le texte d'une page Web. Gardez à l'esprit que la page Web transfère en tant que document texte simple avec des instructions HTML sur le rendu de la page dans un navigateur Web. À partir de ce texte, j'avais besoin extraire tous les liens hypertexte, les afficher sous la forme d'une liste et une sortie les vers un fichier texte local ou les enregistrer dans une autre façon. En HTML, un lien hypertexte indiqué par la balise < a > et peut se présenter comme suit : Click http://concentratedtech.com ici pour visiter

Un problème survient dans la mesure où la balise < a > prend en charge un certain nombre de paramètres facultatifs, tels que de cible, qui force le lien pour ouvrir une nouvelle page. Parfois, la balise < a > peut exister sans le paramètre de href, au lieu de cela, y compris un paramètre name qui établit une ancre dans la page. Je ne souhaitais pas spécifiquement que pour ceux capturer ; je voulais uniquement des liens sortants authentique spécialisée à une autre page.

Alors que je continuerai à couvrir les fonctionnalités et techniques disponibles dans v1 de PowerShell dans mon article, plus je me concentrerai sur les fonctionnalités propres à v2. PowerShell v2 est fourni avec et préinstallé dans Windows 7 et Windows Server 2008 R2. Au moment où vous lisez ceci soit peu après, PowerShell v2 doit être disponible pour Windows Vista, Windows Server 2008, Windows XP et Windows Server 2003. Visitez Microsoft.com/PowerShell pour vérifier la disponibilité et des liens de téléchargement.

Un puzzle régulière

Travail avec des expressions régulières peut être beaucoup comme résolution d'un puzzle. Tout comme si vous ont été fixant à un de ces posters en trois dimensions, squinting permet. Vous devez afficher les informations sous la forme d'un modèle, plutôt que comme des caractères individuels. Squinting peut aider à brouiller les caractères afin que vous puissiez vous concentrer sur le modèle plus grand. Considérez ces quatre liens hypertexte : http://concentratedtech.com. Cliquez sur ici pour visiter.

< a name = "data" > feuille de données < /a >

< a target = "_blank" href="https://microsoft.com" > Microsoft < /a >

< a href="search.aspx" target = "_top" > recherche < /a >

Je veux capturer les liens de ces éléments communs :

  • Elles commencent toutes avec < a
  • Elles se terminent par < /a >
  • Ils sont tous contient href = "quelque part après le < a et avant le >

Je ne veux pas capturer un lien qui ne contient pas de tous les de ces éléments. En ignorant les bits que me n'intéresse et squinting, les liens se présenter comme suit :

< a_href = respectez xxxxxxxxx"> xxxxxxx < /a >

< a_xxxxxxxx > xxxxxxx < /a >

< a_xxxxxxxxxx_href = "xxxxxxxxx" > xxxxxxxx < /a >

< a_href = _xxxxxxxxxx "xxxxxxxxx" > xxxxxxxx < /a >

Notez que vous avez remplacé le caractère espace par un trait de soulignement simplement pour faire ressortir un peu plus et remplacé les choses que je peu sur “ x respectez. Soudain, ces début aspect ressemble beaucoup plus et un motif émerge.

Un modèle régulière

modèles sont le but d'expressions régulières. En utilisant le langage d'expressions régulières, vous décrivez le modèle de texte pour lequel vous recherchez. Vous pouvez obtenir une description assez complète de cette langue en exécutant le aide about_regular_expressions dans Windows PowerShell.

Dans mon cas, mon expression régulière peut ressembler à ceci :

(< a\s.{0,}?href=".+?".{0,}? >. +? < /a >)

Je sais — il est fou. Obtention de la droite m'a pris environ une heure, avec une quantité énorme d'aide à partir du site Web RegExTester.com. Laissez-moi saut vers le bas :

  • (Parenthèses) définissant un motif pour un seul lien hypertexte et indiquent le shell pour capturer des les correspondances (plus loin).
  • Le < un est une correspondance littérale ; le shell recherchera ces deux caractères.
  • \s signifie faire correspondre un caractère espace unique, comme un espace, ce qui doit toujours suivre < un en HTML.
  • .{0,}? signifie que vous souhaitez afficher zéro ou plusieurs caractères de n'importe quel type. La période signifie “ n'importe quel caractère respectez et {0}, signifie zéro ou plus. Le point d'interrogation à droite est spécial. Rend le de correspondance non gourmand (plus que dans une seconde).
  • Ensuite, je veux voir le littéral caractères href = "
  • Ensuite, je veux voir un ou plusieurs de n'importe quel caractère. Le signe plus (+) signifie “ une ou plusieurs respectez et, là aussi, un point d'interrogation à droite rend non gourmand.
  • Après cela, je veux voir un guillemet fermant.
  • Puis je veux voir zéro ou plusieurs caractères et la clôture >.
  • Enfin, je veux voir un ou plusieurs caractères avant le < /a >. Ici, trop, le point d'interrogation après le signe plus (+) en fait une correspondance non gourmand.

Cette entreprise non gourmand est délicate. Let’s disons que je dispose de la chaîne de texte suivante dans ma page HTML :

Il s'agit d'un < a href = "test" > lien < /a > et ceci est une < a href = "test" > lien < /a >, mais cela n'est pas.

Et let’s dire que j'utilise cette expression régulière, qui n'utilise pas les points d'interrogation pour créer de correspondance non gourmand :

(< a\s.{0,}href=".+".{0,} >. + < /a >)

Le shell correspondra à la première < un espace et de zéro ou plusieurs caractères Rechercher puis — fin uniquement lorsqu'il trouve la dernière < /a >. Je vais utiliser les caractères gras pour afficher ce qu'elle corresponde à :

Il s'agit d'un < a href = "test" > lien < /a > et ceci est une < a href = "test" > lien < /a > , mais cela n'est pas.

Cela est dû au fait que la première. {0}, correspondance est gourmands : Le shell consomme autant de caractères que possible tout en effectuant le travail de l'expression régulière. En le rendant non gourmand , je lui consommer moins de caractères que possible tout en effectuant le travail de l'expression régulière :

Il s'agit d'un < a href = "test" > lien < /a > et ceci est un < a href = "test" > lien < /a > , mais cela n'est pas.

Une solution standard

Pour mettre cette opération dans le shell, j'ai commencé en définissant une variable de test et de remplissage avec HTML. J'ai utilisé puis le correspondance opérateur - pour faire correspondre le test HTML par rapport à mon expression régulière.

PS C:\ > $ html = ' il s'agit d'un < a href = "test" > test < /a >, < a name = "anchor" > mais ce < /a > n'est pas et < une cible = "_top" href = "chaîne" > est sans aucun doute < /a > un lien. '

PS C:\ > html de $ - correspondance '(<a\s.{0,}?href=".+?".{0,}?>.+?</a>) '

True

Le résultat “ True respectez m'indique simplement que le shell de trouver une ou plusieurs correspondances ; il n'est pas savoir qu'il correspond. Toutefois, après avoir utilisé le - opérateur correspondance, l'interpréteur de commandes crée automatiquement un tableau, intitulé $ correspondances. Ce tableau contient toutes les correspondances capturées :

PS C:\ > $ correspondances

Name Valeur
1 < a href = "test" > test < /a >
0 < a href = "test" > test < /a >

Vous pouvez accéder correspondances individuels en utilisant la syntaxe de tableau normal :

PS C:\ > $ correspond à [0]

< a href = "test" > test < /a >

Vous pouvez facilement envoyer ceux dans un fichier, trop :

PS C:\ > $ correspondances | out-file c:\matches.txt

 

Une fois que vous maîtrisez la syntaxe, comme bizarre comme c'est le cas, des expressions régulières fournissent un moyen puissant et utile de correspondance de modèles complexes de même, la variables dans un corps de texte volumineux. Vous pouvez extraire le texte qui correspond à votre modèle et travailler dessus indépendamment du corps principal du texte. Ceci est particulièrement utile pour analyse les fichiers journaux, fichiers HTML ou tout autre type de texte semi-structurées.

 

Don Jonesest rédacteur au TechNet Magazine et publie des conseils de Windows PowerShell et de news à www.ConcentratedTech.com. Il est co-auteur de “ Windows PowerShell: TFM respectez (Sapien Press, 2009), présent dans son troisième édition et traitant de Windows PowerShell version 2.

 

Contenu connexe