Abgleich überlappender Muster in Golang: Ein umfassender Leitfaden
Angesichts der Einschränkungen des Regexp-Pakets kann der Abgleich überlappender Muster in Go eine Herausforderung darstellen . Dieser Artikel befasst sich mit einem alternativen Ansatz, der die Einfachheit und Effizienz von strings.Index nutzt, um effektiv einen überlappenden Mustervergleich zu erreichen.
Das Problem:
Gegeben eine Zeichenfolge und ein Bei Mustern wie „..#..“ wollen wir alle Instanzen des Musters finden, unabhängig von ihrer Überlappung. Die vorhandene regexp.FindAllStringSubmatchIndex-Methode erfasst nur nicht überlappende Übereinstimmungen.
Die Lösung:
Anstatt uns auf regexp zu verlassen, erstellen wir eine benutzerdefinierte Lösung mit strings.Index und ein für Schleife:
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 }
Erklärung:
Diese Funktion sucht iterativ nach dem Muster mithilfe von strings.Index im verbleibenden Teil der Eingabezeichenfolge. Jeder gefundene positive Index wird zur Indexliste hinzugefügt. Die Schleife wird fortgesetzt, bis keine weiteren Übereinstimmungen gefunden werden.
Beispielverwendung:
input := "...#...#....#.....#..#..#..#......." pattern := "..#.." result := FindOverlappingPattern(input, pattern) // result: [1, 10, 16, 22, 29]
Vorteile:
Dieser Ansatz ist unkompliziert und nutzt die nativen String-Suchfunktionen von Go. Es übertrifft Regex-basierte Lösungen hinsichtlich Einfachheit und Effizienz für einfache Mustervergleichsaufgaben.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go effizient alle überlappenden Musterübereinstimmungen finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!