2013-05-27 8 views
5

में विभाजक के साथ विभाजित तारों को विभाजित करने के लिए मैं | बार विभाजक के साथ एक टेक्स्ट गुच्छा को विभाजित करने की कोशिश कर रहा हूं। प्रत्येक आईपी एड्रेस ब्लॉक में 123.123.123.123|000.000.000.000। लेकिन प्रत्येक संख्या | द्वारा विभाजित नहीं है।स्केल

scala> "123.123.123.123|000.000.000.000".split("|") 
res30: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, |, 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0) 

scala> "123.123.123.123".split("|") 
res33: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3) 

इसलिए मैंने विभाजक को Char के रूप में रखा और यह दिखाता है कि मेरा इरादा क्या है।

scala> "123.123.123.123|000.000.000.000".split('|') 
res31: Array[String] = Array(123.123.123.123, 000.000.000.000) 

scala> "123.123.123.123".split('|') 
res32: Array[String] = Array(123.123.123.123) 

एकल चरित्र एक बड़ा अंतर क्यों बनाता है?

मैंने स्कैला दस्तावेज़ और StringLike.scala पढ़ा है, और कोई जवाब नहीं मिला है।

def split(separators: Array[Char]): Array[String] 
def split(separator: Char): Array[String] 

धन्यवाद।

+0

[दस्तावेज़ीकरण] के अनुसार [http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.StringOps), 'split' एक char को तर्क के रूप में लेता है। – squiguy

+2

@squiguy न केवल चार: यह वापस जा सकता है [जावा का विभाजन, जो स्ट्रिंग लेता है] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split (जावा। lang.String)) [regex] –

+0

@ ओम-नाम-नाम निश्चित रूप से, उस मामले में '|' विशेष है जो स्पष्ट रूप से आपने अपने उत्तर में कहा था। – squiguy

उत्तर

11

स्प्लिट विधि string या वर्ण (ओं) को स्वीकार करती है। यदि आप स्ट्रिंग का उपयोग करते हैं तो इसे रेगेक्सपी और "|" के रूप में व्याख्या किया जाएगा। रेगेक्स 'या' के रूप में माना जाता है - आपके मामले में यह 'हर चरित्र अपने स्वयं के बिन में जाता है' पर वापस आ जाता है। यह पलायन कच्चे delimeter के लिए:

"123.123.123.123|000.000.000.000".split("\\|") 
res1: Array[String] = Array(123.123.123.123, 000.000.000.000) 

चरित्र विभाजक व्याख्या की है है के रूप में है, तो आप किसी भी उपद्रव

+0

धन्यवाद @ ओम-नाम-नाम! मैं याद रखना भूल गया कि कई स्कैला विधियां वास्तव में जावा.लंग और जावा कक्षाओं से हैं। मैं अगली बार जावडोक के साथ रहूंगा। – eces

2

ध्यान दें कि, ओम-nom-nom सही ढंग से उल्लेख किया बिना वांछित परिणाम मिल गया (लेकिन नहीं किया उदाहरण प्रदान), वर्ण (जो एकल ' में बंद होते हैं) भी मान्य हैं:

"123.123.123.123|000.000.000.000".split('|') 

मैं इस और अधिक स्पष्ट/पठनीय होने के लिए लगता है। मैं यह भी मान रहा हूं कि यह तेज़ होगा, क्योंकि इसे रेगेक्स पार्सर का आह्वान नहीं करना है। लेकिन यह निश्चित रूप से अटकलें है, और अनावश्यक सूक्ष्म अनुकूलन भी है।

+0

यह regexing से काफी तेज होना चाहिए - इसमें कोई संदेह नहीं है। असल में regexing, उस परिदृश्य में बस एक गलती होगी। लेकिन सवाल इसके बारे में नहीं है, और आप जो सुझाव देते हैं वह वास्तव में प्रश्न में पहले से ही खोजा गया है। –

+0

हां, मैंने कहा कि ओम-नाम-नाम पहले से ही इसका उल्लेख कर चुका था। मैं सिर्फ एक वास्तविक उदाहरण प्रदान करना चाहता था, क्योंकि मुझे पता है कि बहुत से लोग (स्वयं सहित) अक्सर कोड के टुकड़े के लिए एक जवाब छोड़ देंगे, जो अक्सर समाधान होता है। चूंकि मैं कोड उदाहरण ओम-नाम-नाम को इष्टतम पोस्ट नहीं करता हूं, इसलिए मैंने अपना खुद का पोस्ट किया है :) – fresskoma

+1

@ x3ro अच्छी तरह से, मैंने यह नहीं लिखा क्योंकि op ने इसे अपने उदाहरणों (res31) में किया था ;-) लेकिन मैं सहमत हूं कि यह स्ट्रिंग संस्करण –