在Go中提取子串

时间:2012-09-07 02:43:59

标签: go substring

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

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

有更惯用的方法吗?也就是说,在为您提取子字符串时,是否已有一个处理结束空字节的库?

(是的,我知道有一种方法可以在go readline -> string中读取没有换行符的行,但我正在寻找更优雅的字符串操作。)

7 个答案:

答案 0 :(得分:103)

看起来你对切片的工作和字符串存储格式感到困惑,这与你在C中的不同。

  • Go中的任何切片都存储长度(以字节为单位),因此您不必关心len操作的成本:无需计算
  • Go字符串不会以空值终止,因此您不必删除空字节,并且您不必在切片后添加1添加空字符串。

要删除最后一个字符(如果它是一个字节的字符),只需执行

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

答案 1 :(得分:18)

Go字符串不是以null结尾,并且要删除字符串的最后一个字符,您可以这样做:

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

答案 2 :(得分:9)

为避免零长度输入发生混乱,请将截断操作包装在if

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

答案 3 :(得分:3)

获取子字符串

  1. 找到“sp”的位置

  2. 使用array-logical

  3. 剪切字符串

    https://play.golang.org/p/0Redd_qiZM

答案 4 :(得分:2)

这是在Go

中执行子字符串的简单方法
package main

import "fmt"

var p = fmt.Println

func main() {

  value := "address;bar"

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

}

答案 5 :(得分:2)

8年后,我偶然发现了这个宝石,但我不相信OP最初的问题确实得到了回答:

所以我想出了以下代码来修剪换行符

虽然bufio.Reader类型支持ReadLine()方法,该方法同时删除了\r\n\n,但这是一个低级函数,由于重复检查而难以使用是必需的。

IMO删除空白的一种惯用方法是使用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)

在Golang游乐场中查看以下示例:https://play.golang.org/p/HrOWH0kl3Ww

答案 6 :(得分:0)

警告:仅对字符串进行操作仅适用于ASCII,并且当输入是非ASCII UTF-8编码字符时,将计数错误,并且甚至会破坏字符,因为它会在中间顺序切割多字节字符。

这是可识别UTF-8的版本:

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