2009-12-30 7 views
9

आप स्कैनर के लिए डिलीमीटर कैसे सेट करते हैं; या नई लाइन?जावा स्कैनर प्रश्न

मैंने कोशिश की: Scanner.useDelimiter(Pattern.compile("(\n)|;")); लेकिन यह काम नहीं करता है।

+0

बग मिला, मुझे उपयोग करना है (\ r \ n) |; मैं इस तरह कुछ पार्स कर रहा था: स्ट्रिंग; संख्या \ r \ n ... और यह 100 \ r की तरह कुछ नहीं ले गया। – Razvi

उत्तर

15

एक सामान्य नियम के रूप में, पैटर्न में, आपको \ को दोगुना करने की आवश्यकता है।

तो,

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));` 

या

Scanner.useDelimiter(Pattern.compile("[\\n;]"));` 

संपादित कोशिश: अगर \r\n समस्या है, तो आप इस की कोशिश करना चाहते हो सकता है:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+")); 

जो मेल खाता है एक या अधिक \r, \n, और ;

नोट: मैंने इन्हें आजमाया नहीं है।

+1

आप किसी भी तरह से जा सकते हैं। यदि आप दो बैकस्लाश का उपयोग करते हैं, तो रेगेक्स कंपाइलर '\ n' देखता है और इसे लाइनफीड के लिए एस्केप अनुक्रम के रूप में व्याख्या करता है। यदि आप एक बैकस्लैश का उपयोग करते हैं, तो रेगेक्स कंपाइलर एक वास्तविक लाइनफीड चरित्र देखता है, जो यह सचमुच मेल खाता है। लेकिन मैं निश्चित रूप से चरित्र-वर्ग संस्करण के साथ जाऊंगा: '" [\\ n;] "' या '" [\ n;] "'; यह पढ़ने के साथ ही अधिक कुशल पढ़ने के लिए आसान है। –

+0

@ अलन मूर: आह, ठीक है ... मैंने अभी माना है कि एक शाब्दिक रेखा तोड़ का गलत अर्थ होगा। – Powerlord

1

ओपी की टिप्पणी को देखते हुए, ऐसा लगता है कि यह एक अलग पंक्ति समाप्त हो रही थी (\ r \ n या CRLF) जो समस्या थी।

यहाँ मेरा उत्तर है, जो किसी भी प्रारूप में कई अर्धविराम और लाइन अंत संभाल हैं (वांछित नहीं हो सकता है या हो सकता है)

Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+")); 

उदा है कोई इनपुट फ़ाइल है कि इस तरह दिखता है:

1 


2;3;;4 
5 

1,2,3,4,5

में परिणाम होगा मैंने कोशिश की सामान्य \ N और \\ n - दोनों मेरे मामले में काम किया है, हालांकि मैं मानता हूँ यदि आपको सामान्य बैकस्लैश की आवश्यकता है तो आप इसे दोहराना चाहते हैं क्योंकि यह एक बचने वाला चरित्र है। ऐसा ही होता है कि इस मामले में, "\ n" अतिरिक्त '\'

9

जैसा वांछित चरित्र है, आपको डॉस/नेटवर्क शैली \r\n (सीआरएलएफ) लाइन विभाजक खोजने की आवश्यकता है यूनिक्स शैली \n (केवल एलएफ) के बजाय। लेकिन क्या होगा यदि पाठ में दोनों शामिल हैं? यह बहुत होता है; वास्तव में, जब मैं इस पृष्ठ के स्रोत को देखता हूं तो मैं दोनों किस्मों को देखता हूं।

आपको दोनों प्रकार के विभाजक, साथ ही पुरानी मैक शैली \r (केवल सीआर) की तलाश करने की आदत में होना चाहिए।

\r?\n|\r 

अपने नमूना कोड में प्लगिंग कि आपको मिलता है::

scanner.useDelimiter(";|\r?\n|\r"); 

यह मानते हुए है आप एक समय में ठीक एक नई पंक्ति या अर्धविराम से मिलान करना चाहते यहाँ एक तरीका है कि ऐसा करने के लिए है।भी कैसे मैं एक regex स्ट्रिंग एक पैटर्न के बजाय में पारित

scanner.useDelimiter("[;\r\n]+"); 

सूचना,;: यदि आप एक या एक से अधिक मेल करना चाहते हैं तो आप इसके बजाए क्या कर सकते हैं सभी regexes स्वचालित रूप से कैश हो जाते हैं, तो regex पूर्व संकलन आपको कोई प्रदर्शन लाभ नहीं मिलता है।