You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ruby正则从指定字符串提取带参数的方法名?

解决Ruby正则提取函数名及参数的问题

嘿,我来帮你搞定这个正则提取的问题!你之前遇到的问题是因为用了贪婪匹配的.*,它会从第一个f(x)后面一直匹配到最后一个),自然得不到想要的拆分结果。

正确的正则写法

针对你的字符串格式,我们可以用这个正则来精准提取每个函数及其参数:

str1='f(x)myfunction1("a",1,"b"),f(x)myfunction2("c","d",4), f(x)myfunction3("e","f","g",3)'
myFunctionArry = str1.scan(/(?<=f\(x\))[a-zA-Z0-9_]+\([^)]+\)/)

执行后,myFunctionArry就会得到你想要的结果:

["myfunction1(\"a\",1,\"b\")", "myfunction2(\"c\",\"d\",4)", "myfunction3(\"e\",\"f\",\"g\",3)"]

正则各部分解释

让我拆解一下这个正则的逻辑:

  • (?<=f\(x\)):正向后行断言,确保我们要匹配的内容前面是f(x)(注意括号要转义,因为正则里括号是特殊语法)
  • [a-zA-Z0-9_]+:匹配函数名,允许字母、数字和下划线,保证能覆盖像myfunction1这类命名
  • \(:匹配函数的左括号(转义避免被当作正则分组)
  • [^)]+:匹配括号内的所有内容,直到遇到第一个右括号)(因为你的参数里没有嵌套括号,这个写法足够精准)
  • \):匹配函数的右括号(转义)

另一种写法(不用断言,用分组捕获)

如果你不习惯用后行断言,也可以通过分组捕获来实现,最后用flatten转成一维数组:

myFunctionArry = str1.scan(/f\(x\)([a-zA-Z0-9_]+\([^)]+\))/).flatten

这个写法的逻辑是直接匹配f(x)开头的片段,然后捕获后面的函数部分,结果和上面完全一致。

为什么你之前的正则不对?

你用的(?<=f\(x\))(.*)(?=\))里的.*是贪婪匹配,它会尽可能匹配最多的字符——从第一个f(x)后面开始,一直吃到最后一个)为止,自然会把所有函数连在一起返回,而不是拆分每个独立的函数。

内容的提问来源于stack exchange,提问作者muratp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:19:52