Go'da beyaz alana bir dize bölmek mi?


115

Gibi bir girdi dizesi verildiğinde " word1 word2 word3 word4 ", bunu Go'da bir dizi dizisi olarak bölmek için en iyi yaklaşım nedir? Her sözcük arasında herhangi bir sayıda boşluk veya unicode boşluk bırakan karakter olabileceğini unutmayın .

Java'da sadece kullanırdım someString.trim().split("\\s+").

(Not: Go'da normal ifade kullanan olası yinelenen Bölme dizesi , kaliteli bir yanıt vermez. Lütfen yalnızca regexpveya stringspaketleri referansına bir bağlantı değil, gerçek bir örnek sağlayın .)

Yanıtlar:


248

stringsPaket sahip Fieldsyöntem.

someString := "one    two   three four "

words := strings.Fields(someString)

fmt.Println(words, len(words)) // [one two three four] 4

DEMO: http://play.golang.org/p/et97S90cIH

Dokümanlardan:

func Fields(s string) []string

Alanlar, dizeyi sbir veya daha fazla ardışık beyaz boşluk karakterinin her bir örneğinin etrafına böler ve ss yalnızca beyaz boşluk içeriyorsa alt dizelerden oluşan bir dizi veya boş bir liste döndürür .


1
Maalesef, strings.Fieldsalıntılanan bölümlerdeki boşlukları göz ardı etmiyor.
chmike

@chmike True, ancak alıntılar devreye girdiği anda, belirli bir kodlama veya formatın kodunu çözme veya ayrıştırma işindesiniz .
mtraceur

@chmike shlexiçin ihtiyacınız olabilir godoc.org/github.com/google/shlex
akhy

8

İpucu kullanıyorsanız: regexp.Split

func (re *Regexp) Split(s string, n int) []string

Dilimleri, ifadeyle ayrılmış alt dizelere bölün ve bu ifade eşleşmeleri arasındaki alt dizelerin bir dilimini döndürür.

Bu yöntem tarafından döndürülen dilim, FindAllString tarafından döndürülen dilimde yer almayan tüm alt dizelerden oluşur. Metakarakter içermeyen bir ifade çağrıldığında, strings.SplitN ile eşdeğerdir.

Misal:

s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5)
// s: ["", "b", "b", "c", "cadaaae"]

Sayı, döndürülecek alt dizelerin sayısını belirler:

n > 0: at most n substrings; the last substring will be the unsplit remainder.
n == 0: the result is nil (zero substrings)
n < 0: all substrings

3
bu aşırı bir
katil

@Tom Ama buradaki en iyi cevap olmasa bile yine de ilginç. Bir şey öğrendiğim için bu yanıta olumlu oy verdim.
Denys Séguret

Fields()Boş dizeler döndürmeyeceğini unutmayın . Dolayısıyla, döndürülen alan sayısı değişecektir. Tutarlı bir şeyi ayrıştırmaya çalışıyorsanız, o zaman sizin için işe yaramayacaktır. Bir FieldsFunc()de işe yaramazsa normal ifadeyi kullanmanız gerekebilir .
Tom

3

Aşağıdakileri buldum, ancak bu biraz fazla ayrıntılı görünüyor:

import "regexp"
r := regexp.MustCompile("[^\\s]+")
r.FindAllString("  word1   word2 word3   word4  ", -1)

hangisi değerlendirilecek:

[]string{"word1", "word2", "word3", "word4"}

Daha kısa veya daha deyimsel bir ifade var mı?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.