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

Edu*_*ira 7 regex go

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

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

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

And*_*eig 14

默认情况下, "." 与换行符不符.如果你给出"s"标志,那就是.我认为你不需要"m".

请注意,如果<think>...</think>字符串中有多个,则regexp将匹配第一个<think>和最后一个之间的所有内容</think>.使用.*?将使它仅匹配第一个的内容.


kub*_*zyk 9

不要使用正则表达式来解析 XML,而是使用encoding/xml。在正则表达式中无法处理的极端情况示例:<think><elem attrib="I'm pondering about </think> tag now"></elem></think>

我将使用STARTSTOP作为标记,只是为了与任何 XML 内容分离。完整示例(包括 LF 和 CRLF 行尾,以防万一),并附有指向 The Go Playground链接

package main

import (
    "fmt"
    "regexp"
)

func main() {
    r := regexp.MustCompile(`(?s)START(.*?)STOP`)
    const s = "That is \nSTART\nFOOBAR\r\n\r\nSTOP\n"
    fmt.Printf("%#v\n", r.FindStringSubmatch(s))
}
Run Code Online (Sandbox Code Playgroud)

返回:

[]string{"START\nFOOBAR\r\n\r\nSTOP", "\nFOOBAR\r\n\r\n"}
Run Code Online (Sandbox Code Playgroud)