英文:
Go regex to search for Jira during clause which contains escaped quotes
问题
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中使用它时,当尝试使用FindAllString
时似乎不起作用(Go Playground)。
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() {
jqlDuringBeginningOfMonthToEndOfMonth := "project = SWB AND status changed from \"In Regression\" to (Done) during (\"2022-09-01\", \"2022-09-30\")"
jqlDuringStartOfMonthToNow := "project = SWB AND status changed from \"In Regression\" to (Done) during (startOfMonth(), now())"
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringBeginningOfMonthToEndOfMonth, -1))
fmt.Println()
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringStartOfMonthToNow, -1))
}
运行结果为:
result: []
result: []
Program exited.
我怀疑这种行为与JQL字符串中的转义引号有关。将JQL字符串更改为使用单引号对结果没有影响。
英文:
Regex 101 shows this regex as valid:
/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
but using it in Go, it does not appear to work when attempting FindAllString
(Go Playground)
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() {
jqlDuringBeginningOfMonthToEndOfMonth := "project = SWB AND status changed from \"In Regression\" to (Done) during (\"2022-09-01\", \"2022-09-30\")"
jqlDuringStartOfMonthToNow := "project = SWB AND status changed from \"In Regression\" to (Done) during (startOfMonth(), now())"
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringBeginningOfMonthToEndOfMonth, -1))
fmt.Println()
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringStartOfMonthToNow, -1))
}
Run shows:
result: []
result: []
Program exited.
I suspect this behaviour has to do with escaped quotes in the JQL strings. Changing the JQL strings to use single quotes did not make a difference in the results, either.
答案1
得分: 0
谢谢Pak Uula的提示。还有这个答案:https://stackoverflow.com/questions/39102902/find-all-string-matches-with-regex-golang
解决方案是在正则表达式中不使用边界,并且正如Pak所提到的,正则表达式中的反引号会处理引号,所以不需要转义。在Go Playground中的解决方案如下:
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\(\)\)`)
}
func main() {
jqlDuringBeginningOfMonthToEndOfMonth := "project = SWB AND status changed from \"In Regression\" to (Done) during (\"2022-09-01\", \"2022-09-30\")"
jqlDuringStartOfMonthToNow := "project = SWB AND status changed from \"In Regression\" to (Done) during (startOfMonth(), now())"
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringBeginningOfMonthToEndOfMonth, -1))
fmt.Println()
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringStartOfMonthToNow, -1))
}
运行结果如下:
result: [during ("2022-09-01", "2022-09-30")]
result: [during (startOfMonth(), now())]
Program exited.
英文:
Thank you Pak Uula for the tip. Also this answer: https://stackoverflow.com/questions/39102902/find-all-string-matches-with-regex-golang
The solution is to not use boundaries on the regex, and also as Pak mentioned, the back-ticks in the regex take care of the quotes; so no need to escape those. Solution in Go Playground
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\(\)\)`)
}
func main() {
jqlDuringBeginningOfMonthToEndOfMonth := "project = SWB AND status changed from \"In Regression\" to (Done) during (\"2022-09-01\", \"2022-09-30\")"
jqlDuringStartOfMonthToNow := "project = SWB AND status changed from \"In Regression\" to (Done) during (startOfMonth(), now())"
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringBeginningOfMonthToEndOfMonth, -1))
fmt.Println()
fmt.Printf("result: %s", duringRegex.FindAllString(jqlDuringStartOfMonthToNow, -1))
}
Run shows:
result: [during ("2022-09-01", "2022-09-30")]
result: [during (startOfMonth(), now())]
Program exited.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论