29Jun

Comment utiliser les expressions régulières de base pour mieux rechercher et gagner du temps

Que vous cherchiez avec Grep ou que vous regardiez des programmes capables de renommer des fichiers par lots, vous vous êtes probablement demandé s'il existait un moyen plus simple de faire votre travail. Heureusement, il y a, et il est appelé "expressions régulières".

( Comic de XKCD.com)

Que sont les expressions régulières?

Les expressions régulières sont des instructions formatées de manière très spécifique et qui peuvent représenter de nombreux résultats différents. Aussi connus sous le nom de "regex" ou "regexp", ils sont principalement utilisés dans les fonctions de recherche et de nommage de fichiers. Une regex peut être utilisée comme une formule pour créer un certain nombre de sorties possibles, toutes recherchées. Vous pouvez également spécifier comment un groupe de fichiers doit être nommé en spécifiant une expression régulière, et votre logiciel peut passer progressivement à la sortie prévue suivante. De cette façon, vous pouvez renommer plusieurs fichiers dans plusieurs dossiers très facilement et efficacement, et vous pouvez aller au-delà des limites d'un système de numérotation simple.

Comme l'utilisation des expressions régulières repose sur une syntaxe spéciale, votre programme doit être capable de les lire et de les analyser. De nombreux programmes de renommage de fichiers par lots pour Windows et OS X prennent en charge les expressions rationnelles, ainsi que l'outil de recherche multiplateforme GREP( que nous avons abordé dans notre Guide Bash Scripting for Beginners) et l'outil de ligne de commande Awk pour * Nix. En outre, de nombreux gestionnaires de fichiers, lanceurs et outils de recherche alternatifs les utilisent et occupent une place très importante dans les langages de programmation tels que Perl et Ruby. D'autres environnements de développement tels que. NET, Java et Python, ainsi que le prochain C ++ 11, fournissent tous des bibliothèques standard pour l'utilisation d'expressions régulières. Comme vous pouvez l'imaginer, ils peuvent être très utiles lorsque vous essayez de minimiser la quantité de code que vous mettez dans un programme.

Remarque sur l'échappement des caractères

Avant de vous montrer des exemples, nous aimerions vous signaler quelque chose. Nous allons utiliser le shell bash et la commande grep pour vous montrer comment appliquer des expressions régulières. Le problème est que parfois nous voulons utiliser des caractères spéciaux qui doivent être passés à grep, et le shell bash interprétera ce caractère car le shell l'utilise également. Dans ces circonstances, nous devons «échapper» à ces personnages. Cela peut être déroutant car cette "fuite" de caractères se produit également à l'intérieur des expressions rationnelles. Par exemple, si nous voulons entrer ceci dans grep:

\ & lt;

nous devrons remplacer cela avec:

\\\ & lt;

Chaque caractère spécial reçoit une barre oblique inverse. Vous pouvez également utiliser des guillemets simples:

'\ & lt;'

Les guillemets simples indiquent à BASH de ne pas interpréter ce qui est à l'intérieur d'eux. Bien que nous ayons besoin de ces étapes pour que nous puissions démontrer pour vous, vos programmes( en particulier ceux basés sur l'interface graphique) ne nécessiteront souvent pas ces étapes supplémentaires. Pour que les choses restent simples et directes, l'expression régulière réelle vous sera donnée sous forme de texte entre guillemets, et vous verrez la syntaxe échappée dans les captures d'écran de la ligne de commande.

Comment se développent-elles?

Les expressions rationnelles sont une manière très concise d'énoncer des termes afin que votre ordinateur puisse les développer en plusieurs options. Jetons un coup d'oeil à l'exemple suivant:

tom [0123456789]

Les crochets - [et] - indiquent au moteur d'analyse que tout ce qui est à l'intérieur, tout caractère UN peut être utilisé pour correspondre. Tout ce qui se trouve à l'intérieur de ces parenthèses s'appelle un jeu de caractères.

Donc, si nous avions une énorme liste d'entrées et nous avons utilisé ce regex pour rechercher, les termes suivants seraient assortis:

  • tom
  • tom0
  • tom1
  • tom2
  • tom3

et ainsi de suite. Cependant, la liste suivante ne correspondrait PAS et ne s'afficherait donc PAS dans vos résultats: tomate

  • ;la regex ne tient pas compte des lettres après "tom"
  • Tom;l'expression rationnelle est sensible à la casse!

Vous pouvez également choisir de rechercher avec un point( .) Qui permettra n'importe quel caractère présent, tant qu'il y a un caractère présent.

Comme vous pouvez le voir, grepping avec

. tom

n'a pas fait apparaître de termes qui avaient seulement "tom" au début. Même les "tomates vertes" sont arrivées, parce que l'espace avant "tom" compte comme un caractère, mais les termes comme "tomF" n'ont pas de caractère au début et sont donc ignorés.

Remarque: Le comportement par défaut de Grep est de renvoyer une ligne entière de texte lorsque certaines parties correspondent à votre regex. D'autres programmes ne peuvent pas faire cela, et vous pouvez désactiver cela dans grep avec le drapeau '-o'.

Vous pouvez également spécifier l'alternance en utilisant un tube( |), comme ici:

speciali( s | z) e

Vous trouverez les deux:

  • specialize
  • specialize

Lorsque vous utilisez la commande grep, nous devons échapper les caractères spéciaux( ,|, et) avec des barres obliques inverses ainsi que l'utilisation du drapeau '-E' pour que cela fonctionne et éviter les erreurs laides.

Comme nous l'avons mentionné plus haut, c'est parce que nous devons dire au shell bash de passer ces caractères à grep et de ne rien faire avec eux. L'indicateur '-E' indique à grep d'utiliser les parenthèses et le tuyau en tant que caractères spéciaux.

Vous pouvez rechercher par exclusion à l'aide d'un caret qui est à la fois entre crochets et au début d'un ensemble:

tom [^ F | 0-9]

Encore une fois, si vous utilisez grep et bash, pensez à vous échapperce tuyau!

Les termes qui étaient dans la liste mais qui n'apparaissent PAS sont:

  • tom0
  • tom5
  • tom9
  • tomF

Ils ne correspondaient pas à notre regex.

Comment puis-je utiliser les environnements?

Souvent, nous cherchons en fonction des limites. Parfois, nous voulons seulement des chaînes qui apparaissent au début d'un mot, à la fin d'un mot, ou à la fin d'une ligne de code. Ceci peut être facilement fait en utilisant ce que nous appelons des ancres.

L'utilisation d'un caret( hors des parenthèses) vous permet de désigner le "début" d'une ligne.

^ tom

Pour rechercher la fin d'une ligne, utilisez le signe dollar.

tom $

Vous pouvez voir que notre chaîne de recherche vient AVANT l'ancre dans ce cas.

Vous pouvez également utiliser les correspondances qui apparaissent au début ou à la fin des mots, pas les lignes entières.

\ & lt; tom

tom \ & gt;

Comme nous l'avons mentionné dans la note au début de cet article, nous devons échapper ces caractères spéciaux parce que nous utilisons bash. Vous pouvez également utiliser des guillemets simples:

Les résultats sont les mêmes. Assurez-vous d'utiliser des guillemets simples, et non des guillemets doubles.

Autres ressources pour Advanced Regexps

Nous avons seulement atteint la pointe de l'iceberg ici. Vous pouvez également rechercher des termes d'argent délimités par le marqueur de devise et rechercher l'un des trois termes correspondants ou plus. Les choses peuvent devenir vraiment compliquées. Si vous souhaitez en savoir plus sur les expressions régulières, consultez les sources suivantes.

  • Zytrax.com a quelques pages avec des exemples spécifiques de pourquoi les choses ne correspondent pas.
  • Regular-Expressions.info a également un guide de tueur pour beaucoup de choses plus avancées, ainsi qu'une page de référence pratique.
  • Gnu.org a une page dédiée à l'utilisation des regexps avec grep.

Vous pouvez également créer et tester vos expressions régulières à l'aide d'un outil en ligne Flash gratuit appelé RegExr. Il fonctionne comme vous tapez, est gratuit et peut être utilisé dans la plupart des navigateurs.

Avez-vous un usage favori pour les expressions régulières? Connaissez-vous un grand renamer de lot qui les utilise? Peut-être que vous voulez juste vous vanter de votre grep-fu. Contribuez vos pensées en commentant!