Golang多线正则表达式无法正常工作

时间:2016-05-09 02:00:44

标签: regex go

为什么以下多行正则表达式不起作用,我希望匹配标记内的子字符串。其他简单的多行匹配工作正常。

func main() {
    r := regexp.MustCompile(`(?m)<think>(.*)</think>`)
    const s = `That is 
    <think>
    FOOBAR
    </think>`
    fmt.Printf("%#v\n", r.FindStringSubmatch(s))
}

https://play.golang.org/p/8C6u_0ca8w

2 个答案:

答案 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"}