2012-07-01 11 views
19

मेरा आरईपीएल आउटपुट निम्नलिखित है। मुझे यकीन नहीं है कि क्यों string.split यहां काम नहीं करता है।scala string.split काम नहीं करता

val s = "Pedro|groceries|apple|1.42" 
s: java.lang.String = Pedro|groceries|apple|1.42 

scala> s.split("|") 
res27: Array[java.lang.String] = Array("", P, e, d, r, o, |, g, r, o, c, e, r, i, e, s, |, a, p, p, l, e, |, 1, ., 4, 2) 

उत्तर

56

यदि आप उद्धरणों का उपयोग करते हैं, तो आप नियमित अभिव्यक्ति विभाजन के लिए पूछ रहे हैं। | "या" वर्ण है, इसलिए आपका रेगेक्स कुछ भी नहीं या कुछ भी मेल नहीं खाता है। तो सब कुछ विभाजित है।

यदि आप split('|') या split("""\|""") का उपयोग करते हैं तो आपको जो चाहिए वह प्राप्त करना चाहिए।

+0

अच्छा एक। स्कैला में, '' और "" के बीच क्या अंतर है? – riship89

+2

'" "" सामान "" "एक शाब्दिक स्ट्रिंग उद्धृत करता है। '" सामान "'बचने के पात्रों का अर्थ है। चूंकि बैकस्लैश जावा स्ट्रिंग _and_ regexes में एक एस्केप कैरेक्टर _both_ है, इसलिए आपको इसे रेगेक्स में लाने के लिए एस्केप कैरेक्टर से बचने की आवश्यकता होगी: '" \\ | "'। यह _very_ को भ्रमित कर देता है, इसलिए ट्रिपल कोट्स का उपयोग करना और शाब्दिक स्ट्रिंग के लिए जाना बेहतर है। –

+0

और ... 'somestring' जैसा है "" "somestring" ""? – riship89

3

स्प्लिट पहली तर्क के रूप में रेगेक्स लेता है, इसलिए आपकी कॉल को "खाली स्ट्रिंग या खाली स्ट्रिंग" के रूप में व्याख्या किया जाता है। अपेक्षित व्यवहार प्राप्त करने के लिए आपको पाइप चरित्र से बचने की आवश्यकता है "\\ |"।

5

| एक विशेष नियमित अभिव्यक्ति चरित्र जो OR के संचालन के लिए एक तार्किक ऑपरेटर के रूप में प्रयोग किया जाता है।

के बाद से java.lang.String#split(String regex); एक नियमित अभिव्यक्ति में ले जाता है, तो आप "कोई नहीं या कोई नहीं" है, जो एक पूरे के नियमित अभिव्यक्ति बंटवारे के बारे में एक और विशेषता है, जहां कोई भी अनिवार्य रूप से हर एक चरित्र के बीच का अर्थ है "के साथ स्ट्रिंग बंटवारे रहे हैं "

आप जो चाहते हैं उसे पाने के लिए, आपको अपने रेगेक्स पैटर्न को ठीक से बचाना होगा। पैटर्न से बचने के लिए, आपको \ के साथ चरित्र को प्रीपेड करने की आवश्यकता है और \ उदाहरण के लिए एक विशेष String वर्ण (\t और \r सोचें), आपको वास्तव में डबल से बचने की आवश्यकता है ताकि आप s.split("\\|") के साथ समाप्त हो जाएं।

पूर्ण जावा नियमित अभिव्यक्ति वाक्यविन्यास के लिए, java.util.regex.Pattern javadoc देखें।

संबंधित मुद्दे