如何找到跳过N个字符的子字符串

时间:2019-01-08 11:06:23

标签: string go

如何获取从某个位置/特定偏移量开始跳过的字符串中子字符串的索引,例如:

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 ] )中的类似偏移量

2 个答案:

答案 0 :(得分:2)

strings软件包没有为您提供此类功能,但实际上很少需要。通常,strings.Split()函数用于将字符串轻松拆分为标记/部分。

但是,如果您确实需要它:您可以简单地slicestring {有效地进行复制(不进行复制,结果与原始string值共享内存)。 / p>

因此,您正在寻找的功能实际上看起来像这样:

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]中。

答案 1 :(得分:-1)

以utf-8字符截取字符串片段可能会产生损坏的字符串,因为您需要将其转换为符文

[]rune(videoHtml)[0:index]