2015-03-16 3 views
0

Je travaille sur une application CLI, qui permet à l'utilisateur de spécifier un argument avec des noms de fonctions et des arguments. Il utilise en fait la même syntaxe que xgettext, tels que:Expression régulière pour extraire les noms et les paramètres des fonctions xgettext à partir d'arguments cli

--keywords=__,dgettext:2,dcgettext:2,ngettext:1,2,dpgettext2:2c,3

J'ai besoin de trouver un regex qui le décomposer en un tableau comme celui-ci:

['__', 'dgettext:2', 'dcgettext:2', 'ngettext:1,2', 'dpgettext2:2c,3']; 

Comment puis-je faire il (en Javascript, par exemple)?

Voici ce que j'ai jusqu'à présent:

(((?!([0-9\s,])).|^)[a-zA-Z_]+[A-Za-z0-9_]*[:]*([0-9]*[a-z]*,*)*) 

Il est évident que cela a un problème: il est aussi la capture la virgule à chaque fois. Une idée de comment je peux le laisser tomber?

Répondre

0

Basé sur @ réponse de Fede, voici un extrait complet qui fait exactement ce que je avais besoin:

// The last keyword is invalid - it begins with a number, 
// which is not allowed, so it should not considered a separate keyword 
var keywords = "__,dgettext:2,dcgettext:2,ngettext:1,2,dpgettext2:2c,3,__,_n,_,2"; 
keywords.split(/,(?=[a-z_]+\w*)/gi); 

Ce qu'il fait est qu'il cherche des virgules qui sont suivies par un mot-clé valide et divise alors la chaîne à base sur ce dans un tableau, ce qui est exactement ce dont j'avais besoin.

2

Vous pouvez utiliser une expression rationnelle à l'aide avant positive, une expression régulière comme ceci:

,(?=\w+gettext) 

Working demo

+0

Cela capture les virgules ... J'ai besoin de capturer les mots-clés avec des arguments. Peut-être que c'est un bon point de départ cependant, mais je ne suis pas sûr de savoir comment je pourrais aller de l'avant à partir d'ici? – ragulka

+0

@ragulka vous devez utiliser cette regex pour diviser vos chaînes, alors vous obtiendrez le contenu que vous voulez –

+0

ah, got it! tu as raison - je n'y ai jamais pensé. J'ai ajusté votre regex pour travailler avec des noms de fonction même un caractère – ragulka

0
var pattern = /(([\w_]+:\w+(,\w+)*)(?=(,[\w_]+:)|(,_+)|($)))|(_+)/g ; 
var test = "--keywords=__,dgettext:2,dcgettext:2,nGettext:1,2,dpgettext2:2c,3,N_:1"; 
var n = test.match(pattern); 
alert(n.length); 
alert(n); 

Cela ressemble pour le symbole: hex, (hex). dcgettext: 2,2c est un tel modèle. La regex est pour mon symbole est [\ w_ +], donc le modèle pour le tout est./[\ w _] +: \ w + (, \ w +) */où j'utilise \ w pour 'hex'. Je pourrais utiliser [0-9a-f] + pour hex, ce qui serait plus correct, mais plus difficile à lire. Ensuite, je qualifierai plus loin en exigeant que le groupe soit suivi d'une virgule et d'un autre groupe, ou une virgule et un groupe de soulignement, ou la fin de la ligne. J'écris ceci comme (? = (, [\ W _] + :) | (, _ +) ($)).

Enfin, j'accepte aussi les groupes de soulignement autonomes comme (_ +).

Je ne sais pas si cela gère toutes les formes de xgettext, j'ai seulement travaillé avec votre exemple de texte. Fournir plus de texte d'exemple si vous voulez une meilleure regex de travail.

+1

Généralement, les réponses sont beaucoup plus utiles si elles incluent une explication de ce que le code est destiné à faire, et pourquoi cela résout le problème sans en présenter d'autres. Surtout s'ils sont regexen, étant donné qu'ils sont généralement opaques. –

+0

Cette regex ne semble pas fonctionner correctement. Pour le mot clé '__', il ne capture que la première moitié, c'est-à-dire' _'. En outre, il ne capture pas les mots-clés comme '_, Q_, N_,' – ragulka