【问题标题】:regex for function call that takes 0 or more integers正则表达式,用于需要 0 个或多个整数的函数调用
【发布时间】:2017-10-29 07:06:35
【问题描述】:

我正在寻找一些正则表达式帮助来解析函数名称及其参数。

f() 有效且没有参数 - 应返回 [<f,[]>](函数名映射数组和参数数组)。

f(); g() 是两个没有参数的函数 f 和 g - 应该返回 [<f,[], <g,[]>]

f(1,2) - 带有两个参数的函数 f - 应该返回 [<f, [1,2]>]

f(1,2); g(1) 应该返回 [<f, [1,2]>; <g, [1]>]

所以基本上它是一个以分号分隔的一系列函数名称(一个或多个逗号分隔的整数/数字类型的参数)。

我正在寻找一个带有匹配器方法的正则表达式来让它工作。

【问题讨论】:

  • 抱歉没有意识到已经发布了。里面有格式问题。虽然不明白 -1 的弹幕
  • 所以要明确一点,你明确地忽略了f(g(1))f("1, 1")f((1, 1))f(..args) 等等?
  • @Andreas 我知道你是版主并且有很高的stackoverflow,但请不要妄下结论。如果您认为无需借助某种自定义词法分析器或解析器即可解决上述问题,我很乐意参与这场辩论。
  • 我以什么方式提出了类似的建议?您要求我们编写一个正则表达式,甚至自己都没有尝试这样做,即它读作是一个为我编写代码的问题,而这不是本网站的目的。您是否甚至通过链接查看原因的解释?
  • 好吧,感觉不错。

标签: javascript java regex


【解决方案1】:

你可以使用一些正则表达式,像这样:

List<String> functions = Arrays.asList("f()", "f(); g()", "f(1,2)", "f(1,2);    g(1)");
String regex = "([a-z]+\\(.*?\\));?";
String regex2 = "([a-z]+)\\((.*?)\\)";
for (String func : functions) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(func);
    while (matcher.find()) {
        Pattern pattern2 = Pattern.compile(regex2);
        Matcher matcher2 = pattern2.matcher(matcher.group(1));
        if (matcher2.find()) {
            System.out.println("function name = " + matcher2.group(1) + ", params "
                    + Arrays.asList(matcher2.group(2).split(",")));
        }
    }
}

输出

function name = f, params []
function name = f, params []
function name = g, params []
function name = f, params [1, 2]
function name = f, params [1, 2]
function name = g, params [1]

详情:

  • 第一个获取提取函数的正则表达式 ([a-z]+\(.*?\));?,因为它可以是多个函数,而不是您需要循环以逐个获取 (regex demo)
  • 第二个正则表达式([a-z]+)\((.*?)\) 获取函数名称和括号之间的所有内容 (regex demo)
  • 因此,当您得到括号之间的所有内容时,您可以使用, 拆分以获取参数列表

【讨论】:

  • 谢谢,这真的很好。一个问题是函数内部的参数只是数字类型。我可以做一个 Integer.parseInt() 来消除字符串,但有没有更优雅的方法。
  • 您可以完成并使用正则表达式,以便检查if(param.matches("\\d+")){ 以消除字符串;)
  • 谢谢 :) .. 我曾考虑是否应该使用某种词法分析器和解析器逻辑来使解决方案更加健壮。除非需求发生巨大变化,否则这应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2013-06-29
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多