正则表达式在 Go 中不匹配
Regex not matching in Go
我有一个在 Go 中不匹配的正则表达式。
然而在正则表达式游乐场中它匹配良好:https://regex101.com/r/VNDXcQ/2.
匹配JS注释。
代码如下:
comment := "// fallback response. For more information contact support"
re := regexp.MustCompile(`/\/\*[\s\S]*?\*\/|([^\:]|^)\/\/.*$/gm`)
matches := re.MatchString(comment)
fmt.Println(matches) // false
为什么会这样?
主要有两个问题:
- 您正在使用正则表达式文字作为字符串正则表达式模式。这意味着,您需要通过将其转换为
(?m)
内联修饰符 来删除第一个和最后一个 /
和“移动” m
标志到模式
- 您只匹配第一次出现的
MatchString
(因为标志不能与正则表达式模式一起传递并且 g
标志“不受支持”)。您需要使用 FindAllString
来获取所有匹配项。
你可以用
解决这个问题
re := regexp.MustCompile(`(?m)/\*[\s\S]*?\*/|([^\:]|^)//.*`)
matches := re.FindAllString(comment, -1)
注意 /
不是特殊字符,因此不需要转义。
我有一个在 Go 中不匹配的正则表达式。
然而在正则表达式游乐场中它匹配良好:https://regex101.com/r/VNDXcQ/2.
匹配JS注释。
代码如下:
comment := "// fallback response. For more information contact support"
re := regexp.MustCompile(`/\/\*[\s\S]*?\*\/|([^\:]|^)\/\/.*$/gm`)
matches := re.MatchString(comment)
fmt.Println(matches) // false
为什么会这样?
主要有两个问题:
- 您正在使用正则表达式文字作为字符串正则表达式模式。这意味着,您需要通过将其转换为
(?m)
内联修饰符 来删除第一个和最后一个 - 您只匹配第一次出现的
MatchString
(因为标志不能与正则表达式模式一起传递并且g
标志“不受支持”)。您需要使用FindAllString
来获取所有匹配项。
/
和“移动” m
标志到模式
你可以用
解决这个问题re := regexp.MustCompile(`(?m)/\*[\s\S]*?\*/|([^\:]|^)//.*`)
matches := re.FindAllString(comment, -1)
注意 /
不是特殊字符,因此不需要转义。