代码之家  ›  专栏  ›  技术社区  ›  Fluffy

如何查找跳过n个字符的子字符串

  •  0
  • Fluffy  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  2
  •   icza    7 年前

    这个 strings 包并没有提供这样的功能,但实际上很少需要它。经常 strings.Split() 函数用于轻松地将字符串拆分为标记/部分。

    但如果你真的需要它:你可以简单地 slice 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 代码点,但除此之外,字节索引将大于 符文 索引,因为这些代码点以UTF-8编码映射到多个字节(这就是go如何在内存中存储字符串)。 strings.Index() 返回字节索引,以及 len(s) 还将返回字节长度,因此示例将正确处理所有字符串。

    您的原始任务使用 字符串.split() 可能如下所示:

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

    哪个输出(在 Go Playground ):

    [something.value something end]
    

    要“解析”出的值在 parts[1] .