Go正则匹配含转义引号的JQL during子句失效问题排查
Go正则匹配JQL的during语句失效问题
问题概述
我在Regex 101上验证通过的正则表达式,在Go语言中调用FindAllString时完全无法匹配目标JQL字符串,返回结果始终为空数组。
验证通过的正则(Regex 101)
/during.*\(\"\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\",.*\"\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\"\)|during.*\(startOfMonth\(\),.*now\(\)\)/gm
Go示例代码
package main import ( "fmt" "regexp" ) var duringRegex *regexp.Regexp func init() { duringRegex = regexp.MustCompile(`/during.*\(\"\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\",.*\"\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\"\)|during.*\(startOfMonth\(\),.*now\(\)\)/gm`) } func main() { jql1 := "project = SWB AND status changed from \"In Regression\" to (Done) during (\"2022-09-01\", \"2022-09-30\")" jql2 := "project = SWB AND status changed from \"In Regression\" to (Done) during (startOfMonth(), now())" fmt.Printf("result: %s\n", duringRegex.FindAllString(jql1, -1)) fmt.Printf("result: %s\n", duringRegex.FindAllString(jql2, -1)) }
运行结果
result: [] result: [] Program exited.
我曾怀疑是JQL中的转义引号导致问题,但将JQL的双引号改为单引号后,结果依然为空。
问题原因及解决方案
1. 正则语法适配问题
Regex 101使用的是PCRE风格语法,带/分隔符和gm修饰符,但Go的regexp包不支持这种写法:
- 去掉首尾的
/分隔符:Go正则不需要用分隔符包裹表达式 - 移除末尾的
gm修饰符:g全局匹配由FindAllString方法本身实现;m多行模式若需要可通过(?m)嵌入正则,此场景下不需要
2. 转义字符错误
Regex 101中的\"是HTML转义后的引号,而实际JQL中的引号是普通双引号"。在Go的反引号字符串中,双引号不需要转义,直接写"即可,无需使用\"。
修正后的正则表达式
duringRegex = regexp.MustCompile(`during.*\("\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])",.*"\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])"\)|during.*\(startOfMonth\(\),.*now\(\)\)`)
运行效果
修正后重新运行代码,将正确匹配到两个JQL字符串中的during片段:
result: [during ("2022-09-01", "2022-09-30")] result: [during (startOfMonth(), now())]
内容的提问来源于stack exchange,提问作者mikequentel
相关产品推荐
相关产品推荐

