गो में व्हाट्सएप पर एक स्ट्रिंग विभाजित करें?


115

इनपुट स्ट्रिंग को देखते हुए " word1 word2 word3 word4 ", गो में स्ट्रिंग्स की एक सरणी के रूप में इसे विभाजित करने के लिए सबसे अच्छा तरीका क्या होगा? नोट हो सकता है कि किसी भी प्रत्येक शब्द के बीच रिक्त स्थान या यूनिकोड-रिक्ति वर्णों की संख्या।

जावा में मैं सिर्फ उपयोग करूंगा someString.trim().split("\\s+")

(नोट: गो में नियमित अभिव्यक्ति का उपयोग करके डुप्लिकेट स्प्लिट स्ट्रिंग किसी भी अच्छी गुणवत्ता का जवाब नहीं देता है। कृपया वास्तविक उदाहरण प्रदान करें, न कि केवल एक लिंक regexpया stringsपैकेज संदर्भ।)

जवाबों:


248

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यदि केवल सफ़ेद स्थान सम्‍मिलित है या रिक्त सूची के सबस्ट्रिंग की एक सरणी लौटाती है।


1
दुर्भाग्य से, strings.Fieldsउद्धृत भागों में रिक्त स्थान को अनदेखा नहीं करता है।
chmike

@chmike सच है, लेकिन पल उद्धरण शामिल हो जाते हैं, आप कुछ विशिष्ट एन्कोडिंग या प्रारूप को डीकोड या पार्स करने के व्यवसाय में हैं ।
mtraceur

@chmike आपको shlexउस godoc.org/github.com/google/shlex की
akhy

8

यदि आप टिप का उपयोग कर रहे हैं: regexp.Split

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

स्प्लिट स्लाइस अभिव्यक्ति द्वारा अलग किए गए सबस्ट्रिंग में हैं और उन एक्सप्रेशन मैच के बीच सबस्ट्रिंग का एक टुकड़ा लौटाता है।

इस विधि द्वारा लौटे स्लाइस FindAllString द्वारा लौटाए गए स्लाइस में निहित नहीं है के सभी substrates के होते हैं। जब एक अभिव्यक्ति पर बुलाया जाता है जिसमें कोई मेटाचैकर नहीं होता है, तो यह स्ट्रिंग्स के बराबर होता है ।plitN।

उदाहरण:

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

@ लेकिन यह सबसे अच्छा जवाब है, भले ही यह अभी भी दिलचस्प है। मैंने इस जवाब को गलत ठहराया क्योंकि मैंने कुछ सीखा है।
१४

आपको ध्यान देना चाहिए कि Fields()खाली तार वापस नहीं आएंगे। इसलिए लौटे खेतों की संख्या अलग-अलग होगी। यदि आप लगातार कुछ पार्स करने की कोशिश कर रहे हैं, तो यह आपके लिए काम नहीं करेगा। अगर आपको FieldsFunc()भी काम नहीं करेगा तो आपको regex का उपयोग करना पड़ सकता है ।
टॉम

3

मैं निम्नलिखित के साथ आया था, लेकिन यह थोड़ा बहुत लगता है:

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

जो मूल्यांकन करेगा:

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

क्या अधिक कॉम्पैक्ट या अधिक मुहावरेदार अभिव्यक्ति है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.