从 cli args 中提取 xgettext 函数名称和参数的正则表达式
Regular expression to extract xgettext function names and params from cli args
我正在开发一个 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]*,*)*)
显然这有一个问题:它每次都会捕获逗号。知道我怎么能把它去掉吗?
您可以使用像这样的正则表达式来使用具有正前瞻性的正则表达式:
,(?=\w+gettext)
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);
这会查找 symbol:hex,(hex)。 dcgettext:2,2c就是这样一个模式。正则表达式是我的符号是 [\w_+],所以整体的模式是。 /[\w_]+:\w+(,\w+)*/ 其中我使用 \w 表示 'hex'。我可以使用 [0-9a-f]+ 作为十六进制,这会更正确,但更难阅读。
然后我进一步限定,要求组后跟一个逗号和另一个组,或逗号和下划线组,或行尾。我这样写 (?=(,[\w_]+:)|(,_+)($)).
最后,我也接受独立的下划线组作为 (_+)。
我不知道这是否可以处理所有形式的 xgettext,我只使用了您的示例文本。如果您想要更好的正则表达式,请提供更多示例文本。
根据@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);
它的作用是查找后跟有效关键字的逗号,然后根据逗号将字符串拆分为数组,这正是我所需要的。
我正在开发一个 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]*,*)*)
显然这有一个问题:它每次都会捕获逗号。知道我怎么能把它去掉吗?
您可以使用像这样的正则表达式来使用具有正前瞻性的正则表达式:
,(?=\w+gettext)
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);
这会查找 symbol:hex,(hex)。 dcgettext:2,2c就是这样一个模式。正则表达式是我的符号是 [\w_+],所以整体的模式是。 /[\w_]+:\w+(,\w+)*/ 其中我使用 \w 表示 'hex'。我可以使用 [0-9a-f]+ 作为十六进制,这会更正确,但更难阅读。
然后我进一步限定,要求组后跟一个逗号和另一个组,或逗号和下划线组,或行尾。我这样写 (?=(,[\w_]+:)|(,_+)($)).
最后,我也接受独立的下划线组作为 (_+)。
我不知道这是否可以处理所有形式的 xgettext,我只使用了您的示例文本。如果您想要更好的正则表达式,请提供更多示例文本。
根据@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);
它的作用是查找后跟有效关键字的逗号,然后根据逗号将字符串拆分为数组,这正是我所需要的。