Go에서 부분 문자열 추출


114

콘솔에서 전체 줄 (공백 포함)을 읽은 다음 처리하려고합니다. bufio.ReadString을 사용하면 개행 문자가 입력과 함께 읽혀 지므로 개행 문자를 자르기 위해 다음 코드를 작성했습니다.

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

이것을 수행하는 더 관용적 인 방법이 있습니까? 즉, 하위 문자열을 추출 할 때 끝 널 바이트를 처리하는 라이브러리가 이미 있습니까?

(예, go readline-> string 에서 개행 문자없이 행을 읽는 방법이 이미 있다는 것을 알고 있지만 우아한 문자열 조작을 더 찾고 있습니다.)

답변:


146

C에서 사용하는 것과는 다른 슬라이스 작업과 문자열 저장 형식으로 인해 혼란스러워 보입니다.

  • Go의 모든 슬라이스는 길이 (바이트)를 저장하므로 len작업 비용에 대해 신경 쓸 필요가 없습니다. 계산할 필요가 없습니다.
  • Go 문자열은 null로 끝나지 않으므로 null 바이트를 제거 할 필요가 없으며 1빈 문자열을 추가하여 슬라이싱 후 추가 할 필요가 없습니다 .

마지막 문자 (1 바이트 문자 인 경우)를 제거하려면 다음을 수행하십시오.

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

11
0 (또는 :)도 필요하지 않습니다 s = s[:len(s)-1].
uriel

8
이 방법은 유니 코드 문자열에서는 작동하지 않습니다! groups.google.com/forum/#!msg/golang-nuts/ZeYei0IWrLg/…
Melllvar 2013 년

@Melllvar 그래서 내가 "만약 1 바이트 문자 인 경우"라고 정했습니다 . 1 바이트 이상을 차지하는 문자를 제거하려면 (OP의 경우가 아님) 적응해야합니다.
Denys Séguret 2013 년

25

Go 문자열은 null로 끝나지 않으며 문자열의 마지막 문자를 제거하려면 다음을 수행하면됩니다.

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

10
이것은 올바르지 않으며 버그를 유발합니다. 이것은 문자열 에서 마지막 바이트를 제거하여 유효하지 않은 UTF-8 (또는 다른 멀티 바이트 인코딩)을 렌더링 할 수 있습니다.
박사. Sybren

3
이것이 어떻게 중단되는지에 대한 예는 play.golang.org/p/K3HBBtj4Oi 를 참조하십시오 .
박사. Sybren

10

길이가 0 인 입력에 대한 패닉을 피하려면 truncate 연산을 if

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

9

이것은 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)

}

7

경고 : 문자열에서만 작동하면 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])
}

1
이것은 더 많은 upvotes가 필요합니다-utf-8 인식 분할을 사용하지 않아 심하게 물 렸습니다.
kolaente


2

8 년 후 나는이 보석을 우연히 만났지만 OP의 원래 질문이 실제로 대답되었다고 생각하지 않습니다.

그래서 개행 문자를 자르기 위해 다음 코드를 생각해 냈습니다.

그동안 bufio.Reader유형이 지원하는 ReadLine() 방법을 모두 제거합니다되는 \r\n하고 \n이를 반복 검사가 필요하기 때문에 사용에 어색 낮은 수준의 함수로서 의미한다.

IMO는 공백을 제거하는 관용적 인 방법은 Golang의 문자열 라이브러리 를 사용하는 것입니다 .

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.