2016-05-09 10 views
1

Warum die folgenden Multiline-Regex nicht funktionieren, erwarte ich, die Teilzeichenfolge innerhalb der Tags übereinstimmen. Andere einfache mehrzeilige Übereinstimmungen funktionierten korrekt.Golang Multiline Regex funktioniert nicht

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

+0

Try '(? M) ([^ <]+)' oder wenn nicht-greediness unterstützt wird '(? M) (. *?)' – heemayl

Antwort

6

standardmäßig "" passt nicht zu Newline. Wenn Sie das "s" -Flag geben, tut es das. Ich glaube nicht, dass du "m" brauchst.

Beachten Sie, dass, wenn mehrere <think>...</think> in Ihrer Zeichenfolge sind, der Regexp alles zwischen dem ersten <think> und dem letzten </think> übereinstimmen wird. Wenn Sie .*? verwenden, stimmt es nur mit dem Inhalt des ersten überein.

+0

dachte ich, das gleiche über '.' aber in golang' s 'ist standardmäßig eingestellt: https://github.com/google/re2/wiki/Syntax Obwohl dies scheint es zu beheben, so denke ich, die Dokumente sind falsch ... – Endophage

+0

Oder vielleicht bin ich nur falsch lesen die Dokumente .. – Endophage

+0

Wenn 's = true', dann wird die neue Zeile übereinstimmen, der Standardwert ist' false'. Danke für die Klarstellung. –