2010-04-07 6 views
3

Si je veux obtenir la longueur de chaque match dans les parenthèses dans la regex suivante, comment puis-je faire ?:Comment obtenir la longueur d'une correspondance regex dans vim?

^\(\-\+\s\)\+ 

Je suis en train de modifier la largeur des colonnes dans un tampon avec des données est présenté comme une table. Depuis les deux premières lignes de la table ressemblera à ceci

DESIGN_ID DESIGN_YEAR SOURCE_REFERENCE 
---------- ----------- ---------------- 

Je veux utiliser l'expression régulière pour trouver la largeur actuelle de chaque colonne.

+1

vous pouvez économiser sur les échappements avec le commutateur \ v ([very magic] (http://vimdoc.sourceforge.net/htmldoc/pattern.html#/\v)): '\ v^(- + \ s) + 'Echapper de' -' n'est pas nécessaire dans les deux cas. –

Répondre

5

Eh bien, comment voulez-vous le capturer?

Cela mettra au début de toutes les lignes correspondantes:

:%s/^-\+\%(\s-\+\)*\s\?$/\=strlen(submatch(0)) . ': '. submatch(0) 

\= vous permet de substituer le résultat d'une expression vimscript pour une chaîne correspondante. submatch(0) est la chaîne correspondant (submatch(n) serait le nième groupe).

+0

avec beaucoup de magie: ':% s/\ v^- +% (\ s - +) * \ s? $/\ = Strlen (submatch (0)). ':'. submatch (0) ' –

+0

au lieu d'utiliser + et \? ici, je suggère d'utiliser \ {1,} et \ {-}, parce que les deux vous donne un peu plus de flexibilité et facilite le changement. [pattern] \ {n, m} signifie match où pattern entre n et m fois. [pattern] \ {n, -} l'opérateur '-' le rend non-gourmand –

+0

La page d'aide correspondante pour ceci peut être trouvée sous 'sub-replace-expression'. – timss

Questions connexes