为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2023-06-01 10:03:48
如何从某个位置/某个偏移量开始跳过字符串中的子字符串的索引,例如:package mainimport (    "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 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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上尝试):

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


查看完整回答
反对 回复 2023-06-01
?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

[]rune(videoHtml)[0:index]


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信