如何用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
相关产品推荐
相关产品推荐

