字符前的字符串拆分

Posted

技术标签:

【中文标题】字符前的字符串拆分【英文标题】:String splitting before character 【发布时间】:2019-08-08 06:34:27 【问题描述】:

我是新手,一直在使用 split 来发挥我的优势。最近我遇到了一个问题,我想拆分一些东西,并将拆分字符保留在我的第二个切片中而不是删除它,或者像使用 SplitAfter 一样将它留在第一个切片中。

例如下面的代码:

strings.Split("email@email.com", "@")

返回:["email", "email.com"]

strings.SplitAfter("email@email.com", "@")

返回:["email@", "email.com"]

获取["email", "@email.com"] 的最佳方式是什么?

【问题讨论】:

最简单的方法是将分隔符“添加”到每个但返回的切片中的第一项。 play.golang.com/p/sA33rVeJjRt 他所做的基本上是我所做的,但他给了你一个很好用的功能。 【参考方案1】:

使用strings.Index找到@并切片得到两部分:

var part1, part2 string
if i := strings.Index(s, "@"); i >= 0 
    part1, part2 = s[:i], s[i:]
 else 
    // handle case with no @

Run it on the playground.

【讨论】:

使用您的建议,这里有一个更完整的实现:play.golang.org/p/P4rZvBAuSih【参考方案2】:

这对你有用吗?

s := strings.Split("email@email.com", "@")
address, domain := s[0], "@"+s[1]
fmt.Println(address, domain)
// email @email.com

然后梳理并创建一个字符串

var buffer bytes.Buffer
buffer.WriteString(address)
buffer.WriteString(domain)
result := buffer.String()
fmt.Println(result)
// email@email.com

【讨论】:

如果字符串不包含@,则此答案中的代码将出现恐慌。【参考方案3】:

你可以使用bufio.Scanner:

package main

import (
   "bufio"
   "strings"
)

func email(data []byte, eof bool) (int, []byte, error) 
   for i, b := range data 
      if b == '@' 
         if i > 0 
            return i, data[:i], nil
         
         return len(data), data, nil
      
   
   return 0, nil, nil


func main() 
   s := bufio.NewScanner(strings.NewReader("email@email.com"))
   s.Split(email)
   for s.Scan() 
      println(s.Text())
   

https://golang.org/pkg/bufio#Scanner.Split

【讨论】:

以上是关于字符前的字符串拆分的主要内容,如果未能解决你的问题,请参考以下文章

拆分和分配字符

如何在批处理脚本中将字符串拆分为 3 个不同的字符串?

正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值

Java字符串拆分:“忽略”拆分参数[重复]

在 C# 中用另一个字符串拆分一个字符串

c_cpp 字符串拆分小程序拆分字符串