2016-05-18 5 views
3

мне было интересно, как удалить:.Как удалить избыточные пробелы/пробелы из строки в Голанге?

  • Все ведущий/ведомой пробельные или новой строки символов, нулевые символы и т.д.
  • Есть лишние пробелы внутри строки (напр «привет [пробел] [space] world "будет преобразован в" hello [space] world ")

Возможно ли это с помощью одного Regex, с поддержкой Unicode для международных символов пространства и т. д.?

+2

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

+0

Было бы чище, чтобы определить простую функцию .... –

+1

' s: = strings.TrimSpace (строки. 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

Используйте regexp для этого.

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

отличный ответ, если вы не хотите использовать регулярное выражение! –

Смежные вопросы