2017-05-27 12 views
4

ゴランには引用符で囲まれた文字列があります。私の目標は、側面のすべての引用符を削除することですが、文字列の内部のすべての引用符を無視することです。これを行うにはどうしたらいいですか?私の本能は、C#のようなRemoveAt関数を使用するように指示していますが、Goのようなものは表示されません。例えばゴランの文字列の前後の引用符を削除するには

""hello"" 

"""hello""" 

本なる:これは、さらに明確にするため

hello""world 

"hello""world" 

はに変換されなければなりません

を削除する必要があります。

答えて

14

slice expressionを使用します。

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

引用符が存在しないという可能性がある場合は、この使用:

if len(s) > 0 && s[0] == '"' { 
    s = s[1:] 
} 
if len(s) > 0 && s[len(s)-1] == '"' { 
    s = s[:len(s)-1] 
} 

playground example

2

を削除したスライスを利用することができますスライスの最初と最後の要素

package main 

import "fmt" 

func main() { 
    str := `"hello""world"` 

    if str[0] == '"' { 
     str = str[1:] 
    } 
    if i := len(str)-1; str[i] == '"' { 
     str = str[:i] 
    } 

    fmt.Println(str) 
} 

スライスは基本となるメモリを共有するため、この文字列はコピーされません。 strスライスを変更して1文字を開始し、すぐに1文字を終了させます。

これはどのようにthe various bytes.Trim functionsが機能するかです。

+0

この回答のコピー2倍のデータ、。 –

+0

@CeriseLimónありがとう、私はまだ文字列と[]バイトの関係を学んでいます。私はコピーがいつ起こるのか、そうでないのかを説明するページを持っていましたが、私はそれを間違って配置しました。あなたは資源を持っていますか? – Schwern

+1

文字列のバッキング配列は不変であり、[]バイトのバッキング配列は可変です。あるタイプから他のタイプへの変換時に、バッキング配列をコピーする必要があります。つまり、文字列の存続期間中に[]バイトに変更がないことをコンパイラが証明できる場合があります。これらの場合、文字列は[]バイトのバッキング配列を共有します。そのようなケースの1つは[]バイトを使ってmap [string] sometype: 'm [string(p)]'の値を検索することです。変換から返される文字列は、バッキング配列を[]バイトpと共有します。 –

2

slice expressionsを使用してください。不完全な入力に対して正しい出力を提供する堅牢なコードを記述する必要があります。例えば、

package main 

import "fmt" 

func trimQuotes(s string) string { 
    if len(s) >= 2 { 
     if s[0] == '"' && s[len(s)-1] == '"' { 
      return s[1 : len(s)-1] 
     } 
    } 
    return s 
} 

func main() { 
    tests := []string{ 
     `"hello""world"`, 
     `"""hello"""`, 
     `"`, 
     `""`, 
     `"""`, 
     `goodbye"`, 
     `"goodbye"`, 
     `goodbye"`, 
     `good"bye`, 
    } 

    for _, test := range tests { 
     fmt.Printf("`%s` -> `%s`\n", test, trimQuotes(test)) 
    } 
} 

出力:一度文字列への変換[]バイト中の[]バイト変換と、一度に文字列で

`"hello""world"` -> `hello""world` 
`"""hello"""` -> `""hello""` 
`"` -> `"` 
`""` -> `` 
`"""` -> `"` 
`goodbye"` -> `goodbye"` 
`"goodbye"` -> `goodbye` 
`goodbye"` -> `goodbye"` 
`good"bye` -> `good"bye` 
関連する問題