为什么以下多行正则表达式不起作用,我希望匹配标记内的子字符串。其他简单的多行匹配工作正常。
func main() {
r := regexp.MustCompile(`(?m)<think>(.*)</think>`)
const s = `That is
<think>
FOOBAR
</think>`
fmt.Printf("%#v\n", r.FindStringSubmatch(s))
}
答案 0 :(得分:12)
默认情况下,“。”与换行符不符。如果你给出“s”标志,那就是。我认为你不需要“m”。
请注意,如果您的字符串中有多个<think>...</think>
,则正则表达式将匹配第一个<think>
和最后一个</think>
之间的所有内容。使用.*?
将使其仅匹配第一个的内容。
答案 1 :(得分:1)
使用now supported的完整示例(包括LF和CRLF行尾,以防万一):
package main
import (
"fmt"
"regexp"
)
func main() {
r := regexp.MustCompile(`(?s)<think>(.*)</think>`)
const s = "That is \n<think>\nFOOBAR\r\n\r\n</think>\n"
fmt.Printf("%#v\n", r.FindStringSubmatch(s))
}
返回:
[]string{"<think>\nFOOBAR\r\n\r\n</think>", "\nFOOBAR\r\n\r\n"}