2016-05-18 120 views
3

は私が削除する方法を思っていた:。Golangの文字列から余白/空白を削除するには?

  • すべてがリード/文字列(例:内空白や改行文字、ヌル文字など
  • どれ冗長末尾のスペースを「ハロー[スペース]

国際的なスペース文字などをユニコードでサポートする単一のRegexで可能ですか?

+2

'' 'strings.TrimSpace()' '' –

+0

簡単な関数を定義するためにきれいになるだろう.... –

+1

' s:= strings.TrimSpace(strings.Replace(orig、 ""、 ""、-1)) 'はかなりシンプルなようです。スペース文字は通常、ASCIIスペースだけです。異なるスペース文字を取得する場合は、それらを明示的に処理する必要があります。 – elithrar

答えて

8

bytes.Trim(src []byte, cutset string)機能を使用することができますあなたがUnicodeを一致させるために\s速記文字クラスと\p{Zs} Unicodeプロパティの両方を使用する場合がありますようですスペース。しかし、2つの異なる置換が必要なので、1つの正規表現置換で両方のステップを実行することはできません。ReplaceAllStringFuncは、一致文字列全体を引数として許可します(一致するグループをチェックする方法はわかりません)。

したがって、私は2つの正規表現使用を示唆している:

  • ^[\s\p{Zs}]+|[\s\p{Zs}]+$を - すべての空白
  • [\s\p{Zs}]{2,}末尾/リーディングと一致する - 文字列

サンプルコード内の2つの以上の空白記号を一致させます:

package main 

import (
     "fmt" 
     "regexp" 
) 

func main() { 
     input := "  Text   More here   " 
     re_leadclose_whtsp := regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`) 
    re_inside_whtsp := regexp.MustCompile(`[\s\p{Zs}]{2,}`) 
    final := re_leadclose_whtsp.ReplaceAllString(input, "") 
    final = re_inside_whtsp.ReplaceAllString(final, " ") 
     fmt.Println(final) 
} 
+1

美しい、ありがとう! –

-1

これにはregexpを使用してください。

func main() { 
    data := []byte(" Hello, World ! ") 
    re := regexp.MustCompile(" +") 
    replaced := re.ReplaceAll(bytes.TrimSpace(data), []byte(" ")) 
    fmt.Println(string(replaced)) 
    // Hello, World ! 
} 

も改行やヌル文字をトリミングするために、あなたの代わりにbytes.TrimSpace

+0

これはunicodeと他の "不可視"の文字などもカバーしますか?理想的には、ほとんどの場合、見た目のように見える2つの等しい文字列をマッチングから除外したいと考えています。 –

+0

golangの文字列(https://blog.golang.org/strings)について読んで、このコードを変更して置き換える文字を置き換えることをお勧めします。私のコードは、正確な解決策ではなく、あなたが尋ねたことをする方法の一例になることを意図しています。 –

18

これまでちょうどstrings.Fieldsとしてstringsパッケージを使用すると、あなたのための作業のほとんどを行います。

package main 

import (
    "fmt" 
    "strings" 
) 

func standardizeSpaces(s string) string { 
    return strings.Join(strings.Fields(s), " ") 
} 

func main() { 
    tests := []string{" Hello, World ! ", "Hello,\tWorld ! ", " \t\n\t Hello,\tWorld\n!\n\t"} 
    for _, test := range tests { 
     fmt.Println(standardizeSpaces(test)) 
    } 
} 
// "Hello, World !" 
// "Hello, World !" 
// "Hello, World !" 
+1

正規表現を使用したくない場合は素晴らしい答えです! –

関連する問題