2012-11-22 12 views
8

के लिए Regex मैं एक फ़ाइल से मिलान करने की कोशिश कर रहा हूं जो एकाधिक रिक्त स्थान से सीमित है। मेरी समस्या यह है कि पहले फ़ील्ड में एक ही स्थान हो सकता है। मैं इसे रेगेक्स से कैसे मेल कर सकता हूं?एकल स्थान

उदाहरण के लिए:

Name   Other Data Other Data 2 
Bob Smith  XX1   0101010101 
John Doe  XX2   0101010101 
Bob Doe  XX3   0101010101 
John Smith  XX4   0101010101 

मैं एक रिक्ति से एक regex, बंटवारे के साथ तीन क्षेत्रों में इन पंक्तियों को विभाजित लेकिन पहले क्षेत्र में एक जगह के लिए अनुमति कर सकते हैं?

+1

आप किस भाषा का उपयोग कर रहे हैं? – garyh

+4

आपको जरूरी नहीं कि रेगेक्स की आवश्यकता हो। चूंकि वे रिक्त स्थान से अलग होते हैं, इसलिए आप प्रत्येक कॉलम प्राप्त करने के लिए केवल 15 वर्ण पढ़ सकते हैं और फिर डेटा प्राप्त करने के लिए व्हाइटस्पेस को बाहर निकाल सकते हैं। –

उत्तर

6

हाय निम्नलिखित regex काम

(\w*\s\w*)\s+\w{2}\d\s+\d* 
+1

आपके उत्तर ने मुझे सही regex के लिए नेतृत्व किया, धन्यवाद। मैं उपयोग किया गया अंतिम regex '(। *?) [] {2,} (। *?) [] {2,} (। *?) [] {2,} (। *?) [] {2, } (। *?) [] {2,} (। *?) [] {2,} (। *?) $ ' – Echilon

+0

हाय @ एचिलॉन, फीडबैक के लिए टीएनएक्स, खुशी है कि मैं अपने न्यूनतम रेगेक्स ज्ञात के साथ मदद कर सकता हूं:) –

2

आप दो या अधिक रिक्त स्थान पर विभाजित कर सकते चाहिए:

[ ]{2,} 

लेकिन आप शायद बेहतर कर रहे हैं, यह नियमित अभिव्यक्ति की कैप्चर की लंबाई निर्धारित करने :

(Name[ ]+)(Other Data[ ]+) 

और फिर एक साधारण-स्ट्रिंग विधि है कि आपके लाइनों स्लाइस उपयोग करने के लिए एक ही लंबाई के हिस्सों में।

तो आपके मामले में पहला कैप्चर 15 वर्ण लंबा होगा, दूसरा 14 और कॉलम में 13 होगा (लेकिन आखिरी वाला वास्तव में कोई फर्क नहीं पड़ता है, यही कारण है कि यह वास्तव में कब्जा नहीं किया जाता है)। फिर आप पहले 15, अगले 14 और प्रत्येक पंक्ति के शेष वर्ण और trim प्रत्येक को लें (पिछला सफेद स्थान हटाएं)।

0

आमतौर पर, इस तरह की फाइलों के साथ, सबसे अच्छी बात यह है कि आपकी आवश्यक जानकारी कहां है और फिर इसे ट्रिम करें। मैं देखता हूं कि आपकी फ़ाइल में दूसरे फ़ील्ड से पहले 16 वर्ण हैं, आप शुरुआत से 16 लंबाई का एक सबस्ट्रिंग प्राप्त कर सकते हैं जिसमें आपका वांछित टेक्स्ट होगा। रिक्त स्थान के बिना आपको केवल वही पाठ प्राप्त करने के लिए इसे ट्रिम करना चाहिए।

यदि आपके द्वारा पोस्ट किया गया अंतर पैटर्न लगातार है (यदि यह इस तरह की विभिन्न फ़ाइलों के बीच नहीं बदलेगा) तो आपको एक और समस्या भी है: लंबे नामों का क्या होता है?

Name   Other Data 
Johnny AppleseeXX1 
TutankamonfirstXX2 

यदि आप वास्तव में रेगेक्स का उपयोग करना चाहते हैं, तो उन कोने के मामलों से बचने के लिए सुनिश्चित रहें।

3

यह काम करेगा:

पैटर्न:

(.*?)[ ]{2,}(.*?)[ ]{2,}(.*) 

रिप्लेसमेंट:

+$1+ -$2- *$3* 

$1 पहले कॉलम, $2 दूसरे और $3 तीसरा शामिल हैं।

उदाहरण: http://regexr.com?32tbt

0

मुझे लगता है कि सबसे सरल एक regex कि दो या अधिक रिक्त स्थान से मेल खाता उपयोग करने के लिए है।

/ +/ 

जो टूटता है ...डेलीमीटर (/) के बाद एक स्थान () के बाद एक और स्थान एक या अधिक बार ( +) के बाद अंत में डेलीमीटर (/ मेरे उदाहरण में, लेकिन भाषा विशिष्ट है)।

तो बस स्थानांतरित करने के लिए रेगेक्स का उपयोग करें, फिर अपनी स्ट्रिंग को विभाजित करने के साधन के रूप में एक या अधिक रिक्त स्थान।

+0

'/' regex का हिस्सा नहीं हैं और केवल कुछ निश्चित भाषाओं में डिलीमीटर के रूप में उपयोग किया जाता है। इसके अलावा, पठनीयता के लिए, मैं प्रत्येक शाब्दिक स्थान को रेगेक्स में '[] 'के रूप में लिखने की अत्यधिक अनुशंसा करता हूं। –

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