Correspondance de modèles qui se chevauchent dans Golang : un guide complet
La correspondance de modèles qui se chevauchent peut poser un défi dans Go, étant donné les limites du package d'expressions régulières . Cet article explore une approche alternative qui utilise la simplicité et l'efficacité des chaînes.Index pour obtenir efficacement une correspondance de modèles qui se chevauchent.
Le problème :
Étant donné une chaîne et un modèle, tel que "..#..", notre objectif est de trouver toutes les instances du modèle indépendamment de leur chevauchement. La méthode regexp.FindAllStringSubmatchIndex existante capture uniquement les correspondances qui ne se chevauchent pas.
La solution :
Au lieu de nous fier à l'expression rationnelle, nous construisons une solution personnalisée en utilisant strings.Index et un pour loop:
func FindOverlappingPattern(input, pattern string) []int { idx := []int{} j := 0 for { i := strings.Index(input[j:], pattern) if i == -1 { break } fmt.Println(j) idx = append(idx, j+i) j += i + len(pattern) } fmt.Println("Indexes:", idx) return idx }
Explication:
Cette fonction recherche de manière itérative le modèle à l'aide de strings.Index dans la partie restante de la chaîne d'entrée. Chaque index positif trouvé est ajouté à la liste des index. La boucle continue jusqu'à ce qu'aucune autre correspondance ne soit trouvée.
Exemple d'utilisation :
input := "...#...#....#.....#..#..#..#......." pattern := "..#.." result := FindOverlappingPattern(input, pattern) // result: [1, 10, 16, 22, 29]
Avantages :
Cette approche est simple et exploite les capacités natives de recherche de chaînes de Go. Il surpasse les solutions basées sur les expressions régulières en termes de simplicité et d'efficacité pour les tâches simples de correspondance de modèles.
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!