Golang正则表达式:提取带括号的函数名
解决从字符串中提取带括号的函数名问题
你的正则表达式存在三个关键问题:
- 强制要求函数名前有
\s+(空格),导致无前置空格的函数名无法匹配 - 仅匹配带下划线的函数名(
\w+_\w+),不符合示例中func1、func2这类无下划线的情况 - 没有关联函数调用的核心特征
(),无法精准识别函数调用
修正后的正则与代码
使用(?:^|\W)(\w+)\(作为正则表达式,配合Go的FindAllStringSubmatch提取函数名:
package main import ( "fmt" "regexp" ) func main() { // 正则解释: // (?:^|\W):匹配字符串开头或非单词字符(避免误匹配标识符的一部分) // (\w+):捕获函数名(由字母、数字、下划线组成,符合Go标识符规则) // \(:匹配函数调用的左括号,确保是函数而非普通标识符 var re = regexp.MustCompile(`(?:^|\W)(\w+)\(`) testCases := []string{ "A = 2&& B = 2 && func1(A) && func2(B)", "func1(A)", "B = 2 && func2(A)", } for _, str := range testCases { matches := re.FindAllStringSubmatch(str, -1) var funcNames []string for _, match := range matches { funcNames = append(funcNames, match[1]) } fmt.Printf("字符串: %q\n提取的函数名: %s\n\n", str, funcNames) } }
运行结果
字符串: "A = 2&& B = 2 && func1(A) && func2(B)" 提取的函数名: [func1 func2] 字符串: "func1(A)" 提取的函数名: [func1] 字符串: "B = 2 && func2(A)" 提取的函数名: [func2]
补充说明
如果你的函数名可能包含Unicode合法标识符字符,可以把\w替换为[\pL\pN_]来支持更广泛的标识符场景,针对当前示例的需求,\w已经完全够用。
内容的提问来源于stack exchange,提问作者Abi G
相关产品推荐
相关产品推荐

