正则表达式从cli args中提取xgettext函数名和参数

时间:2015-03-16 19:46:46

标签: javascript regex xgettext

我正在开发一个CLI应用程序,它允许用户使用函数名称和参数指定一个参数。它实际上使用与xgettext相同的语法,例如:

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

我需要找出一个正则表达式,将其分解为如下数组:

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

我该怎么做(例如在Javascript中)?

这是我到目前为止所拥有的:

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

显然这有一个问题:它每次都捕获逗号。知道如何把它留下来吗?

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式使用正则表达式,使用这样的正则表达式:

,(?=\w+gettext)

<强> Working demo

答案 1 :(得分: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);

这会查找符号:十六进制,(十六进制)。 dcgettext:2,2c就是这样一种模式。正则表达式是我的符号是[\ w_ +],所以整体的模式是。 / [\ w _] +:\ w +(,\ w +)* /其中我使用\ w代表'hex'。我可以将[0-9a-f] +用于十六进制,这样会更正确,但更难阅读。

然后我进一步限定要求该组后跟逗号和另一个组,或逗号和下划线组,或行尾。我把它写成(?=(,[\ _ W] + :) |(,_ +)($))。

最后,我还接受独立的下划线组作为(_ +)。

我不知道这是否处理所有形式的xgettext,我只使用你的示例文本。如果您想要更好的正则表达式,请提供更多示例文本。

答案 2 :(得分:0)

根据@ Fede的回答,这里有一个完整的代码片段,完全符合我的需要:

// 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);

它的作用是查找后跟有效关键字的逗号,然后将基于该字符串的字符串拆分为数组,这正是我所需要的。