2010-06-21 4 views
8

Chaque fois que je regarde des expressions régulières de n'importe quelle complexité, mes yeux commencent à arroser. Existe-t-il une solution pour donner différentes couleurs aux différents types de symboles dans une expression regex? Idéalement, j'aimerais mettre en évidence différents caractères littéraux, séquences d'échappement, codes de classes, ancres, modificateurs, retards, etc. Évidemment, la syntaxe change légèrement d'une langue à l'autre, mais c'est un problème à traiter plus tard.Syntaxe en surbrillance pour les expressions régulières dans Vim

Points bonus si cela peut coexister d'une manière ou d'une autre avec la syntaxe mise en évidence par Vim pour n'importe quelle langue utilisant la regex.

Est-ce que cela existe quelque part, ou devrais-je être là pour le faire?

Répondre

6

Les expressions régulières ne sont peut-être pas mises en évidence par une syntaxe, mais vous pouvez essayer de les rendre plus lisibles par d'autres moyens.

Certaines langues vous permettent de casser des expressions régulières sur plusieurs lignes (perl, C#, Javascript). Une fois que vous faites cela, vous pouvez le formater afin qu'il soit plus lisible pour les yeux ordinaires. Here's an example of what I mean.

Vous pouvez également utiliser le advanced (?x) syntax explained here dans certaines langues. Voici un exemple:

(?x:   # Find word-looking things without vowels, if they contain an "s" 
    \b      # word boundary 
    [^b-df-hj-np-tv-z]*  # nonvowels only (zero or more) 
    s      # there must be an "s" 
    [^b-df-hj-np-tv-z]*  # nonvowels only (zero or more) 
    \b      # word boundary 
) 

EDIT:

Comme Al souligné, vous pouvez également utiliser la concaténation de chaîne si tout le reste échoue. Voici un exemple:

regex = ""   # Find word-looking things without vowels, if they contain an "s" 
    + "\b"      # word boundary 
    + "[^b-df-hj-np-tv-z]*"  # nonvowels only (zero or more) 
    + "s"      # there must be an "s" 
    + "[^b-df-hj-np-tv-z]*"  # nonvowels only (zero or more) 
    + "\b";      # word boundary 
+2

+1: C'est un bon moyen de le faire. Lorsque vous écrivez des fonctions dans Vim natif, il n'y a pas de support pour les RE verbeux, mais si vous voulez le faire, vous pouvez utiliser la concaténation de chaînes pour obtenir la même chose. – DrAl

2

Vim possède déjà une coloration syntaxique pour les expressions régulières Perl. Même si vous ne connaissez pas perl lui-même, vous pouvez toujours écrire votre regex en perl (ouvrez un nouveau tampon, réglez le type de fichier sur perl et insérez '/regex/') et la regex fonctionnera dans beaucoup d'autres langages tels que PHP, Javascript ou Python où ils ont utilisé la bibliothèque PCRE ou copié la syntaxe de Perl.

Dans un fichier vimscript, vous pouvez insérer la ligne suivante de code pour obtenir la coloration syntaxique pour regex:

let testvar =~ "\(foo\|bar\)" 

Vous pouvez jouer avec l'expression régulière guillemets doubles jusqu'à ce que vous l'avez travailler.

Il est très difficile d'écrire une coloration syntaxique pour regex dans certaines langues parce que les regex sont écrites dans des chaînes entre guillemets (contrairement à Perl et Javascript où elles font partie de la syntaxe). Pour vous donner une idée, cette syntax script for PHP met en surbrillance regex à l'intérieur des chaînes entre guillemets simples et doubles, mais le code pour mettre en surbrillance juste la regex est plus long que l'ensemble des scripts de syntaxe de la plupart des langages.