2016-05-18 129 views
3

我想知道如何刪除:如何從Golang中的字符串中刪除多餘的空格/空格?

  • 所有前/後的字符串(如內空白或換行字符,空字符等
  • 任何多餘的空格「你好[空格] [空間]世界「將被轉換爲」你好[空間]世界「)

這是可能的一個單一的正則表達式,Unicode支持國際空間字符等?

+2

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

+0

這將會是清潔劑來定義一個簡單的函數.... –

+1

' s:= strings.TrimSpace(strings.Replace(orig,「」,「」,-1))'看起來很簡單。空格字符通常只是ASCII空間。如果你得到不同的空間字符,那麼你需要明確地處理這些字符。 – elithrar

回答

8

看來你可能要同時使用\s速記字符類和\p{Zs} Unicode的屬性相匹配的Unicode空間。然而,兩個步驟不能用1個正則表達式替換完成,因爲你需要兩個不同的替換,並且ReplaceAllStringFunc只允許一個完整的匹配字符串作爲參數(我不知道如何檢查哪個組匹配)。

因此,我建議使用兩個正則表達式:

  • ^[\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

爲此使用正則表達式。

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

爲了還修剪新行和空字符,你可以使用bytes.Trim(src []byte, cutset string)函數而不是bytes.TrimSpace

+0

這是否也包含unicode和其他「隱形」字符等?理想情況下希望消除大多數情況下匹配的兩個看似平等的字符串。 –

+0

我建議您閱讀有關golang字符串(https://blog.golang.org/strings),然後修改此代碼以替換您要替換的確切字符。我的代碼旨在成爲如何做你問的一個例子,而不是確切的解決方案。 –

18

你可以得到相當的到目前爲止僅僅使用strings包爲strings.Fields完成大部分工作的你:

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

偉大的答案,如果你不想使用正則表達式! –