Maison  >  Article  >  développement back-end  >  Pourquoi l'expression régulière `.` de Go ne correspond-elle pas aux nouvelles lignes même lorsque `s` est défini sur True ?

Pourquoi l'expression régulière `.` de Go ne correspond-elle pas aux nouvelles lignes même lorsque `s` est défini sur True ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 01:52:02659parcourir

Why Doesn't Go's Regex `.` Match Newlines Even When `s` is Set to True?

Go Regexp vs. Newline : une distinction subtile

Malgré la documentation sur la syntaxe re2 de Go indiquant que n'importe quel caractère (.) correspond à n'importe quel caractère, y compris les nouvelles lignes lorsque 's' est défini sur true, un programme simple révèle que ce n'est pas le cas.

Sortie du programme

s set to true
not matched
s set to false
matched

Explication

Comme beaucoup d'autres moteurs d'expression régulière, le caractère point (.) ne correspond qu'aux caractères normaux. Pour inclure des nouvelles lignes dans la correspondance, le drapeau "pointer tout" (?s) doit être ajouté à l'expression régulière.

Exemple

<code class="go">import (
    "fmt"
    "regexp"
)

func main() {
    const text = "This is a test.\nAnd this is another line."

    // Without the "dot all" flag, newline is not matched.
    r1 := regexp.MustCompile(".+")
    fmt.Printf("s set to true\n")
    if !r1.MatchString(text) {
        fmt.Println("not matched")
    }

    // With the "dot all" flag, newline is matched.
    r2 := regexp.MustCompile("(?s).+")
    fmt.Printf("s set to false\n")
    if r2.MatchString(text) {
        fmt.Println("matched")
    }
}</code>

Sortie

s set to true
not matched
s set to false
matched

Par conséquent, pour faire correspondre les nouvelles lignes avec l'expression rationnelle Go, il est essentiel d'inclure le drapeau "pointer tout" (?s) dans le modèle d'expression régulière.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn