【问题标题】:Regular expression to extract xgettext function names and params from cli args从 cli args 中提取 xgettext 函数名称和参数的正则表达式
【发布时间】:2015-03-16 19:46:45
【问题描述】:

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

显然这有一个问题:它每次都会捕获逗号。知道如何将其排除在外吗?

【问题讨论】:

    标签: javascript regex xgettext


    【解决方案1】:

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

    ,(?=\w+gettext)
    

    Working demo

    【讨论】:

    • 这捕获了逗号...我需要捕获带有参数的关键字。也许这是一个很好的起点,但我不确定我将如何从这里继续前进?
    • @ragulka 你必须使用该正则表达式来拆分你的字符串,然后你会得到你想要的内容
    • 啊,明白了!你是对的——我从没想过。我已经调整了你的正则表达式,甚至可以使用一个字符的函数名称
    • @ragulka 很高兴为您提供帮助。顺便说一句,如果您认为您的问题已解决,您可以将其标记为已解决:)
    【解决方案2】:

    根据@Fede 的回答,这是一个完整的 sn-p,它完全符合我的需要:

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

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

    【讨论】:

      【解决方案3】:
      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,我只使用了您的示例文本。如果您想要更好的工作正则表达式,请提供更多示例文本。

      【讨论】:

      • 一般来说,如果答案包括对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。特别是如果它们是正则表达式,考虑到它们通常是多么不透明。
      • 这个正则表达式似乎不能正常工作。对于__ 关键字,它只捕获前半部分,即_。此外,它不会捕获像 _,Q_,N_, 这样的关键字
      猜你喜欢
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多