2010-07-19 14 views
7

के लिए सफेद स्थान को अनदेखा करना मुझे 8 या अधिक अंकों से मिलान करने की आवश्यकता है, जिसमें अनुक्रम रिक्त स्थान शामिल कर सकता है।रेगेक्स मैच

उदाहरण के लिए, नीचे दिए गए सभी मान्य मिलान होंगे।

12345678 
1 2345678 
12 3 45678 
1234 5678 
12 34567 8 
1 2 3 4 5 6 7 8 

फिलहाल मैं \d{8,} है लेकिन यह केवल 8 या उससे अधिक अंकों के एक ठोस ब्लॉक पर कब्जा होगा।
[\d\s]{8,} काम नहीं करेगा क्योंकि मैं नहीं चाहता कि सफेद स्थान कैप्चर किए गए वर्णों की गणना में योगदान दे।

उत्तर

1

बाद में वायय बन गया, लेकिन इसे वास्तव में इसके सही उत्तर की आवश्यकता है, और एक कारण है। कौन जानता था कि इस सवाल का इतना जटिल जवाब हो सकता है, है ना? जबरदस्त हंसी। लेकिन रेगेक्स में अंतर के आसपास बहुत सारे विचार हैं।

सबसे पहले; कभी भी रेगेक्स में कोई जगह न डालें। ऐसा करने से आपका रेगेक्स अपठनीय और अनजान हो जाएगा। एक अंतरिक्ष को हाइलाइट करने के लिए माउस का उपयोग करने की यादें यह सुनिश्चित करने के लिए कि केवल एक ही स्थान दिमाग में आता है। यह आपके रेगेक्स को तोड़ देगा:    , लेकिन यह नहीं होगा: [   ], क्योंकि एक चरित्र वर्ग में पुनरावृत्ति को नजरअंदाज कर दिया जाता है। और यदि आपको रिक्त स्थान की सटीक संख्या की आवश्यकता है, तो आप वास्तव में एक वर्ण वर्ग में देख सकते हैं: [ ]{3}। चरित्र वर्ग के बिना बनाम दुर्घटनाएं:     {3} < - यह वास्तव में 5 रिक्त स्थान की तलाश में है, woops!

दूसरा; Freespacing (?x) विकल्प को ध्यान में रखें, जो आपके रेगेक्स को टिप्पणी करने योग्य और मुक्त-स्थान योग्य बनाता है। आपको डरना नहीं चाहिए कि उस विकल्प का उपयोग करने वाला कोई व्यक्ति आपके रेगेक्स को तोड़ सकता है क्योंकि आपने इसमें यादृच्छिक कीबोर्ड रिक्त स्थान डालने का निर्णय लिया है। इसके अलावा, (?x) कुंजीपटल स्थान को अनदेखा करते हैं जब यह एक वर्ण वर्ग के अंदर होता है: [ ]। इसलिए अपने कीबोर्ड रिक्त स्थान के लिए वर्ण वर्गों का उपयोग करना सुरक्षित है।

तीसरा; इस परिदृश्य में \s का उपयोग न करने का प्रयास करें। जैसा कि ओमाघोश बताते हैं, इसमें न्यूलाइन भी शामिल हैं (\r और \n)। आपके द्वारा वर्णित परिदृश्य उस पर पक्षपात नहीं करेगा। हालांकि, ओमाघोश बताते हैं, आप केवल कीबोर्ड रिक्त स्थान से अधिक चाहते हैं। तो आप जो भी कल्पना करते हैं उसके आधार पर आप या तो [ ], [\s-[\r\n]], या [\f\t\v\u00A0\u2028\u2029\u0020] का उपयोग कर सकते हैं। उन विकल्पों में अंतिम दो एक ही बात हैं, लेकिन चरित्र वर्ग घटाव केवल .NET और कुछ अन्य अजीब स्वादों में काम करता है।

चौथा; यह आमतौर पर अधिक निर्मित पैटर्न है: (\s*...\s*)*।यह कोई समझ नहीं आता है। यह इस जैसा है: (\s*\s*...)* या यह: (\s*\s*\s*\s*...)*। क्योंकि पैटर्न दोहराना है। मैं जो कह रहा हूं उसके खिलाफ एकमात्र तर्क यह है कि आपको ... से पहले रिक्त स्थान पर कब्जा करने की गारंटी होगी। लेकिन एक बार वह वास्तव में कभी नहीं चाहता था। बुरी से बुरी हालत, तो आप इस देख सकते हैं: \s*(...\s*)*

Omaghosh निकटतम जवाब था, लेकिन यह कम से कम सही जवाब है:

Regex.Match(input, @"(?:\d[ ]*){8,}").Groups[0].Value; 

या निम्न, अगर हम सवाल सचमुच ले छह विकल्पों कि एकाधिक पंक्तियों में एक ही पाठ में हैं:

Regex.Match(input, @"(?m)^(?:\d[ ]*){8,}$").Groups[0].Value; 

या निम्न है, अगर यह एक बड़ा regex का हिस्सा है और एक समूह की जरूरत है:

Regex.Match(input, @"...((?:\d[ ]*){8,})...").Groups[1].Value; 

और एक .NET क्लास घटाव, या एक Non-.NET स्पष्ट खाली स्थान के वर्ग के साथ [ ] को बदलने के लिए स्वतंत्र महसूस:

@"(?:\d[\s-[\r\n]]*){8,}" 
// Or . . . 
@"(?:\d[\f\t\v\u00A0\u2028\u2029\u0020]*){8,}" 
+0

उत्कृष्ट जवाब! –

0
(\d{8,}\s+)*\d{8,} 

काम करना चाहिए

+0

परीक्षण इस Expressio में, यह केवल '12345678' से मेल खाता है और अन्य में से कोई भी उदाहरण। –

+0

@ ग्रेग बी: मैं देखता हूं कि आपका क्या मतलब है। मैं निश्चित नहीं था। ईमानदार होने के लिए, मुझे नहीं लगता कि यह 'वेनिला' रेगेक्स में संभव है, लेकिन मुझे यकीन है कि इसे संभालने के लिए एक चाल है। रेगेक्स लगाने से पहले सभी सफेद जगहों को पट्टी करना एक और विकल्प है। – leppie

13
(\d *){8,} 

यह एक अंकों शून्य या अधिक रिक्त स्थान के द्वारा पीछा के आठ या उससे अधिक घटनाओं से मेल खाता है। इसे

(*\d *){8,} #there is a space before first asterik 

प्रारंभ में रिक्त स्थान के साथ तारों से मिलान करने के लिए बदलें। या

(\s*\d\s*){8,} 

टैब और अन्य सफेद स्पेस वर्णों (जिसमें न्यूलाइन भी शामिल है) से मेल खाने के लिए।

अंत में, इसे ?: के साथ एक गैर-कैप्चरिंग समूह बनाएं। इस प्रकार यह (?:\s*\d\s*){8,}

+0

+1: बुरा नहीं :) (फिलर टेक्स्ट) – leppie

+1

+1 's * \ d \ s * {8,} वास्तव में' (\ s * \ d \ s *) {8,} ' – TheVillageIdiot

+0

@TheVillateIdiot इसे पहले ही तय कर दिया गया है :) – Amarghosh

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