แยกสตริงในช่องว่างใน Go?


117

ระบุสตริงอินพุตเช่น" word1 word2 word3 word4 "อะไรคือวิธีที่ดีที่สุดในการแบ่งสิ่งนี้เป็นอาร์เรย์ของสตริงใน Go? โปรดทราบว่าจะมีใด ๆจำนวนช่องว่างหรืออักขระ Unicode ระยะห่างระหว่างแต่ละคำ

ใน Java ฉันจะใช้someString.trim().split("\\s+").

(หมายเหตุ: สตริงการแยกที่ซ้ำกันที่เป็นไปได้โดยใช้นิพจน์ทั่วไปใน Goไม่ได้ให้คำตอบที่มีคุณภาพดีใด ๆ โปรดให้ตัวอย่างจริงไม่ใช่แค่ลิงก์ไปยังการอ้างอิงregexpหรือstringsแพ็กเกจ)

คำตอบ:


250

stringsแพคเกจมีFieldsวิธีการ

someString := "one    two   three four "

words := strings.Fields(someString)

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

สาธิต: http://play.golang.org/p/et97S90cIH

จากเอกสาร:

func Fields(s string) []string

เขตข้อมูลจะแยกสตริงsรอบ ๆ อินสแตนซ์ของอักขระเว้นวรรคสีขาวที่ต่อเนื่องกันอย่างน้อยหนึ่งตัวส่งคืนอาร์เรย์ของสตริงย่อยsหรือรายการว่างถ้า s มีเพียงช่องว่างสีขาว


2
ขออภัยstrings.Fieldsอย่าละเลยช่องว่างในส่วนที่ยกมา
chmike

@chmike จริง แต่คำพูดขณะที่ได้มีส่วนร่วม, คุณอยู่ในธุรกิจของการถอดรหัสหรือแยกบางเข้ารหัสหรือรูปแบบ
mtraceur

@chmike คุณอาจจำเป็นshlexสำหรับการที่godoc.org/github.com/google/shlex
akhy

8

หากคุณกำลังใช้ tip: regexp.Split

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

แบ่งส่วนย่อยออกเป็นสตริงย่อยที่คั่นด้วยนิพจน์และส่งคืนส่วนของสตริงย่อยระหว่างนิพจน์ที่ตรงกัน

ชิ้นส่วนที่ส่งคืนโดยวิธีนี้ประกอบด้วยสตริงย่อยทั้งหมดของ s ที่ไม่มีอยู่ในชิ้นส่วนที่ส่งคืนโดย FindAllString เมื่อเรียกใช้นิพจน์ที่ไม่มีอักขระเมตาจะเทียบเท่ากับสตริง SplitN

ตัวอย่าง:

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

การนับกำหนดจำนวนสตริงย่อยที่จะส่งคืน:

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
ดูเหมือนว่าจะเกินความสามารถ
thwd

@ ทอม แต่มันก็ยังน่าสนใจแม้ว่ามันจะไม่ใช่คำตอบที่ดีที่สุดก็ตาม ฉันโหวตคำตอบนี้เพราะฉันได้เรียนรู้บางอย่าง
Denys Séguret

คุณควรทราบว่าFields()จะไม่ส่งคืนสตริงว่าง ดังนั้นจำนวนช่องที่ส่งคืนจะแตกต่างกันไป หากคุณพยายามแยกวิเคราะห์สิ่งที่สอดคล้องกันมันจะไม่ได้ผลสำหรับคุณ คุณอาจต้องใช้ regex หากFieldsFunc()ยังใช้ไม่ได้
ทอม

3

ฉันคิดสิ่งต่อไปนี้ แต่ดูเหมือนจะละเอียดเกินไป:

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

ซึ่งจะประเมินเป็น:

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

มีสำนวนกระชับกว่านี้หรือเปล่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.