Как сопоставить все перекрывающиеся шаблоны - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу получить индексы следующего шаблона (\.\.#\.\.) в следующей строке:

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

Но Golang не управляет совпадением совпадений.

Таким образом, я получил: [[1 6 1 6] [10 15 10 15] [16 21 16 21] [22 27 22 27]]

Как видно, две точки . предшествуют и ставят суффикс второй #, но она не возвращается методом FindAllStringSubmatchIndex.

Я пытался использовать различные методы из регулярных выражений без успеха.Ища документацию, я не нашел ничего полезного в https://golang.org/pkg/regexp и https://golang.org/src/regexp/regexp.go

Напротив, кажется, что регулярное выражение не поддерживает эту функцию изначально:

// Если присутствует «All», подпрограмма сопоставляет последовательные непересекающиеся совпадения всего выражения.

Я могу решить эту проблему, но так как я делаю это упражнение, чтобы изучить Golang, я хочузнать.спасибо :)

Вот мой код для справки:

        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)
        }

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Нет причин использовать для этого регулярное выражение.Regex является излишним для такой простой задачи - он слишком сложный и менее эффективный.Вместо этого вы должны просто использовать strings.Index и цикл for:

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

0 голосов
/ 27 декабря 2018

Go для программистов.Например,

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))
}

Детская площадка: https://play.golang.org/p/nNE5IB1feQT

Выход:

[1 5 10 16 19 22 25]

Ссылки на регулярные выражения:

Сопоставление регулярных выражений может быть простым и быстрым

Реализация регулярных выражений

Синтаксис пакета [regexp /]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...