Как найти подстроку с пропуском N символов - PullRequest
0 голосов
/ 08 января 2019

Как получить индекс подстроки в пропущенной строке, начиная с определенной позиции / с определенным смещением, например ::

package main

import (
    "fmt"
    "strings"
)

func main() {
    string := "something.value=something=end"
    index1 := strings.Index(string, "value=")
    fmt.Println(index1) // prints 10
    // index2 = ... How do I get the position of the second =, 25?
}

Аналогичное смещение в PHP int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

1 Ответ

0 голосов
/ 08 января 2019

Пакет strings не предоставляет вам такой функции, но на практике это редко требуется. Часто функция strings.Split() используется для простого разделения строк на токены / части.

Но если вам это нужно: вы можете просто слайс a string, что эффективно (копия не создается, результат делит память с исходным значением string).

Так что эффективная функция, которую вы ищете, будет выглядеть так:

func Index(s, substr string, offset int) int {
    if len(s) < offset {
        return -1
    }
    if idx := strings.Index(s[offset:], substr); idx >= 0 {
        return offset + idx
    }
    return -1
}

Пример использования:

s := "something.value=something=end"
index1 := strings.Index(s, "value=")
fmt.Println(index1) // prints 10

index2 := Index(s, "=", index1+len("value="))
fmt.Println(index2) // prints 25

Вывод (попробуйте на Go Playground ):

10
25

Обратите внимание, что при разрезании строки и offset вы должны передать нашей функции Index() байтовый индекс, а не rune (символьный) индекс. Они равны до тех пор, пока у вас есть символы с менее чем 128 кодовыми точками, но помимо этого индекс байтов будет больше, чем индекс rune, потому что эти кодовые точки отображаются в несколько байтов в кодировке UTF-8 (то есть, как хранит Go Строки в памяти). strings.Index() возвращает вам байтовый индекс, а len(s) также возвращает вам байтовую длину, поэтому пример будет работать со всеми строками должным образом.

Ваша исходная задача с использованием strings.Split() может выглядеть так:

s := "something.value=something=end"
parts := strings.Split(s, "=")
fmt.Println(parts)

Какие выходы (попробуйте на Go Playground ):

[something.value something end]

Значение, которое вы хотите проанализировать, находится в parts[1].

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