0

我正在开发一个 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]*,*)*)

显然这有一个问题:它每次都会捕获逗号。知道我怎么能把它排除在外吗?

4

3 回答 3

2

您可以通过使用这样的正则表达式来使用具有正前瞻的正则表达式:

,(?=\w+gettext)

工作演示

于 2015-03-16T20:13:40.480 回答
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 用于“十六进制”。我可以将 [0-9a-f]+ 用于十六进制,这会更正确,但更难阅读。

然后我通过要求该组后面跟着一个逗号和另一个组,或者一个逗号和一个下划线组,或者行尾来进一步限定。我这样写 (?=(,[\w_]+:)|(,_+)($))。

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

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

于 2015-03-16T20:29:03.887 回答
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);

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

于 2015-03-18T06:24:09.383 回答