所以我的用例如下:我正在解析一个 SQL 查询,试图获取函数名称和发送到该函数的各个参数。这要求我的正则表达式能够找到名称、左括号、内容和右括号。不幸的是,在测试时发现它有时过于贪婪,抓住额外的括号而其他时候它错过了结束的括号。
这是我在操场上的测试代码:
func getRegex(name string) string {
return fmt.Sprintf("\\$__%s\\b(?:\\((.*?\\)?)\\))?", name)
}
func main() {
var rawSQL = "(select min(time) from table where $__timeFilter(time))"
rgx, err := regexp.Compile(getRegex("timeFilter"))
if err != nil {
fmt.Println(err)
}
var match = rgx.FindAllStringSubmatch(rawSQL, -1)
fmt.Println(match)
}
举个例子https://go.dev/play/p/4FpZblia7Ks
我测试的4个案例如下:
(select min(time) from table where $__timeFilter(time) ) OK
(select min(time) from table where $__timeFilter(time)) NOK
select * from foo where $__timeFilter(cast(sth as timestamp)) OK
select * from foo where $__timeFilter(cast(sth as timestamp) ) NOK
这是一个实时正则表达式版本https://regexr.com/700oh
我来自 javascript 世界,所以从未使用过递归正则表达式,看起来这可能是一种情况?
九州编程
FFIVE
相关分类