【问题标题】:Extracting arguments using regular expressions使用正则表达式提取参数
【发布时间】:2015-10-21 15:37:30
【问题描述】:

我正在尝试使用正则表达式将函数定义中的参数提取到数组中。例如

func(a) -> ['a']
func(a,b) -> ['a','b']
func(a, b) -> ['a','b']

下面的正则表达式正确匹配参数块

/\((?:(\w+),?\s*)+\)/

但是,只返回最后一个匹配的捕获组,即结果是:

func(a) -> ['a']
func(a,b) -> ['b']
func(a,b,c) -> ['c']

这似乎是捕获部分重复单元的普遍有用的模式。有什么方法可以正确达到预期的结果吗?

我保存的正则表达式会话可以找到here

【问题讨论】:

  • 什么语言?该语言是否有反射 API?为什么不在正则表达式中包含func 部分?
  • JS有2个迹象:1)正则表达式和2)使用的正则表达式。
  • 它没有捕获整个模式的原因是因为您使用的是(?:),它被称为非捕获组,当可以使用(?<=\()(.*)(?=\)) 甚至@ 987654328@

标签: javascript regex


【解决方案1】:

正则表达式/\((\w+(?:,\s?\w+)?)\)/ 将为func(a, b) 返回a, b,以及为func(a,b,c) 返回a,b,c

希望这是您想要的,根据您使用的语言,您可以简单地将它们按每个 , 拆分,以便将它们放入一个数组中以便稍后进行索引。

【讨论】:

    【解决方案2】:

    你可以得到这样的参数:

    var s = "func(a, b,  c )";
    var res = s.substring(s.indexOf("(") + 1, s.indexOf(")")).split(/\s*,\s*/g);
    alert(res);

    如果您在示例输入中有独立的字符串,这将起作用。

    我尝试添加的另一种方法是使用 /\(([^()]+)\)/ 正则表达式提取括号组,然后使用 .split(/\s*,\s*/g) 拆分捕获的组 1 内容。

    【讨论】:

    • Javascript 不是这篇文章中的标签,OP 要求提供正则表达式解决方案。
    • 哦,当然可以用 \G 轻松完成。我失去了我的主要互联网连接,我将在我再次正常访问后立即发布。但是,regexr 适用于 JS 正则表达式、AFAIK,而不是 PHP 或 Ruby。
    • @blindoverhang:哦,我看到添加了标签,所以我目前的解决方案似乎是最佳的。无论如何,带有 \G 的解决方案看起来像 (?:\(|(?!^)\G)\K\s*([^,\s]+)\s*,?\s*(?=[^()]*\)) 但仅适用于 PCRE/Oniguruma/.NET 4.5 正则表达式风格。
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 2021-11-27
    • 1970-01-01
    • 2011-06-15
    • 2021-12-16
    相关资源
    最近更新 更多