在Go语言中提取子串

at0kjp5o  于 2023-02-27  发布在  Go
关注(0)|答案(8)|浏览(250)

我试图从控制台读取整行(包括空格),然后处理它。使用bufio.ReadString,换行符与输入一起读取,所以我编写了以下代码来修剪换行符:

input,_:=src.ReadString('\n')
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string

有没有一种更惯用的方法来实现这一点?也就是说,在为您提取子字符串时,是否已经有一个库来处理结尾的空字节?
(Yes,我知道在go readline -> string中已经有一种方法可以读取不带换行符的行,但我更希望看到优雅的字符串操作。)

yxyvkwin

yxyvkwin1#

看起来你被切片的工作方式和字符串存储格式搞糊涂了,这和C语言中的不同。

  • Go语言中的任何一个切片都存储了长度(以字节为单位),所以你不必关心len操作的开销:没有必要数
  • Go语言中的字符串不是以空值结尾的,所以你不需要删除空字节,也不需要在切片后添加空字符串来添加1

要删除最后一个字符(如果是单字节字符),只需执行以下操作

inputFmt:=input[:len(input)-1]
50few1ms

50few1ms2#

警告:单独操作字符串只能使用ASCII,并且当输入是非ASCII UTF-8编码字符时计数错误,甚至可能损坏字符,因为它在序列中间剪切了多字节字符。
下面是一个支持UTF-8的版本:

// NOTE: this isn't multi-Unicode-codepoint aware, like specifying skintone or
//       gender of an emoji: https://unicode.org/emoji/charts/full-emoji-modifiers.html
func substr(input string, start int, length int) string {
    asRunes := []rune(input)
    
    if start >= len(asRunes) {
        return ""
    }
    
    if start+length > len(asRunes) {
        length = len(asRunes) - start
    }
    
    return string(asRunes[start : start+length])
}
tag5nh1u

tag5nh1u3#

Go语言中的字符串不是以空结尾的,要删除字符串的最后一个字符,你可以简单地执行以下操作:

s = s[:len(s)-1]
7gcisfzg

7gcisfzg4#

这是在Go语言中执行substring的简单方法

package main

import "fmt"

func main() {

  value := "address;bar"

  // Take substring from index 2 to length of string
  substring := value[2:len(value)]
  fmt.Println(substring)

}
7uhlpewt

7uhlpewt5#

要避免零长度输入时出现异常,请将truncate操作 Package 在if中

input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
    inputFmt = input[:len(input)-1]
}
// Do something with inputFmt
bsxbgnwa

bsxbgnwa6#

获取子字符串
1.找到“sp”的位置
1.用数组逻辑切割字符串
https://play.golang.org/p/0Redd_qiZM

yvt65v4c

yvt65v4c7#

8年后,我偶然发现了这颗宝石,但我不相信OP最初的问题得到了真正的回答:
所以我编写了下面的代码来删除换行符
虽然bufio.Reader类型支持ReadLine()方法,该方法同时删除\r\n\n,但它是一个低级函数,使用起来很笨拙,因为需要重复检查。
删除空格的惯用方法是使用Golang的strings库:

input, _ = src.ReadString('\n')

// more specific to the problem of trailing newlines
actual = strings.TrimRight(input, "\r\n")

// or if you don't mind to trim leading and trailing whitespaces 
actual := strings.TrimSpace(input)

在GolangPlayground看到这个例子:https://play.golang.org/p/HrOWH0kl3Ww

myzjeezk

myzjeezk8#

希望这个功能能对某人有所帮助,

str := "Error 1062: Duplicate entry 'user@email.com' for key 'users.email'"
getViolatedValue(str)

这用于在主字符串中使用**'**的子字符串

func getViolatedValue(msg string) string {
    i := strings.Index(msg, "'")

    if i > -1 {
        part := msg[i+1:]
        j := strings.Index(part, "'")
        if j > -1 {
            return part[:j]
        }
        return ""
    } else {
        return ""
    }
}

相关问题