猿问

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

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


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


当年话下
浏览 93回答 2
2回答

慕码人2483693

该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 10index2 := Index(s, "=", index1+len("value="))fmt.Println(index2) // prints 25输出(在Go Playground上尝试):1025请注意,在对字符串进行切片时,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].

阿晨1998

取一段带有 utf-8 字符的字符串可能会产生损坏的字符串,因为您需要将其转换为符文[]rune(videoHtml)[0:index]
随时随地看视频慕课网APP

相关分类

Go
我要回答