如何匹配所有重叠的图案

I want to get the indexes of the following pattern (\.\.#\.\.) in the following string :

...#...#....#.....#..#..#..#.......

But Golang does not manage overlapping matching.

Thus I got : [[1 6 1 6] [10 15 10 15] [16 21 16 21] [22 27 22 27]]

As one can see, two points . do precede and suffix the second # but it's not return by the method FindAllStringSubmatchIndex.

I tried to use different methods from regexp without success. Searching the documentation, I found nothing useful on https://golang.org/pkg/regexp and https://golang.org/src/regexp/regexp.go

On the contrary, it seems regexp does not natively support this functionality :

// If 'All' is present, the routine matches successive non-overlapping matches of the entire expression.

I can solve the issue but since I am doing this exercise to learn Golang, I want to know. thanks :)

Here is my code for reference :

        matches := r.pattern.FindAllStringSubmatchIndex(startingState)
        fmt.Println(r.pattern)
        fmt.Println(matches)
        for _, m := range matches {
            tempState = tempState[:m[0]+2] + "#" + tempState[m[0]+3:]
            fmt.Println(tempState)
        }

There's no reason to use a regex for this. Regex is overkill for such a simple task--it's over complex, and less efficient. Instead you should just use strings.Index, and a for loop:

input := "...#...#....#.....#..#..#..#......."
idx := []int{}
j := 0
for {
    i := strings.Index(input[j:], "..#..")
    if i == -1 {
        break
    }
    fmt.Println(j)
    idx = append(idx, j+i)
    j += i+1
}
fmt.Println("Indexes:", idx)

Playground link

Go is for programmers. For example,

package main

import (
    "fmt"
    "strings"
)

func findIndices(haystack, needle string) []int {
    var x []int
    for i := 0; i < len(haystack)-len(needle); i++ {
        j := strings.Index(haystack[i:], needle)
        if j < 0 {
            break
        }
        i += j
        x = append(x, i)
    }
    return x
}

func main() {
    haystack := `...#...#....#.....#..#..#..#.......`
    needle := `..#..`
    fmt.Println(findIndices(haystack, needle))
}

Playground: https://play.golang.org/p/nNE5IB1feQT

Output:

[1 5 10 16 19 22 25]

Regular Expression References:

Regular Expression Matching Can Be Simple And Fast

Implementing Regular Expressions

Package [regexp/]syntax