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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:15:19