我正在开发一个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]*,*)*)
显然这有一个问题:它每次都捕获逗号。知道如何把它留下来吗?
答案 0 :(得分:2)
答案 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);
它的作用是查找后跟有效关键字的逗号,然后将基于该字符串的字符串拆分为数组,这正是我所需要的。