2013-04-30 8 views
6

मैं अधिकतम तीन अलग-अलग वर्ण वाले सभी इनपुट खोजने के लिए रेगेक्स बनाने की कोशिश कर रहा हूं। इससे कोई फर्क नहीं पड़ता कि इनपुट कितना समय है। मामलों कीregex का उपयोग कर विभिन्न वर्णों की संख्या कैसे जांचें?

उदाहरण:

  • "32 32 32 32 34" -> मैच
  • "एम एम" -> मैच
  • "" -> मैच
  • "1234" -> कोई मुकाबला नहीं

मैं चार या अधिक अलग वर्ण के इनपुट को खोजने के लिए रेगुलर एक्सप्रेशन से किया है, लेकिन अब मैं विपरीत तरीके से की आवश्यकता है ...

012,
(.).*(?\1)(.).*(?\1)(?\2)(.).*(?\1)(?\2)(?\3)(.) 

मुख्य प्रश्न है: विभिन्न पात्रों की संख्या कैसे जांचें?

+6

यह एक regex के साथ हल करने के लिए एक बहुत ही जटिल समस्या की तरह मुझे लगता है । क्या यह एक आवश्यकता है? इसे अधिक पारंपरिक तरीके से क्यों हल नहीं करें? – pcalcao

+1

आपके पहले उदाहरण के आधार पर, व्हाइटस्पेस 3 अक्षरों की ओर गिनती नहीं है? –

+2

यह औपचारिक नियमित अभिव्यक्तियों का उपयोग करके प्राप्त नहीं किया जा सकता है, क्योंकि आपको किसी प्रकार की स्टैक या गिनती या राज्य की आवश्यकता होती है, जो नियमित भाषाओं में नहीं हो सकती है। व्यावहारिक रूप से, आप कुछ काम करने में सक्षम हो सकते हैं क्योंकि अधिकांश रेगेक्स पार्सर्स नियमित भाषाओं को परिभाषित नहीं करते हैं, लेकिन एक अलग विधि का उपयोग करना सबसे अच्छा है। – Oliver

उत्तर

3

निम्नलिखित तीन अलग-अलग गैर-स्पेस वर्णों

^\s*(\S)?(?:\s|\1)*(\S)?(?:\s|\1|\2)*(\S)?(?:\s|\1|\2|\3)*$ 

(\S) मैचों एक गैर अंतरिक्ष चरित्र की एक अधिकतम के साथ एक स्ट्रिंग से मेल और यह दर्शाता है तो यह तो एक वापस का उपयोग कर regex में बाद में संदर्भित किया जा सकता होगा - उदाहरण उदा \1?(\S)? में उपयोग किया जाता है ताकि स्ट्रिंग में शून्य, एक, दो या तीन प्रकार के गैर-स्पेस वर्ण हो सकें।

?: समूह को गैर-कैप्चरिंग बनाते हैं।

regex के पहले भाग तीन अलग-अलग गैर-स्पेस वर्णों \1, \2, \3 अप करने के लिए कैप्चर करता है, और उसके बाद (?:\s|\1|\2|\3)* केवल उन अक्षरों या अंतरिक्ष \s सुनिश्चित करता है तो स्ट्रिंग $ के अंत से पहले हो सकते हैं।

एक तरह से, जावास्क्रिप्ट में, "regex का उपयोग कर" एक स्ट्रिंग में विभिन्न गैर अंतरिक्ष वर्णों की संख्या गिनती करने के लिए:

var str = 'ABC ABC'; 
var chars = ''; 

str.replace(/\S/g, function (m) { 
    if (chars.indexOf(m) == -1) chars += m; 
}); 

chars.length; // 3 
+1

आपने शुरुआत और अंत में स्लेश क्यों किया है? (संकेत: स्लेश के पास रेगेक्स के साथ कुछ भी नहीं करना है। वे एक ऐप भाषा आर्टेफैक्ट हैं) – Bohemian

+2

@ बोहेमियन यह एक आम सम्मेलन है, जैसे कि उद्धरण चिह्नों या कोण ब्रैकेट के अंदर यूआरएल डालने की तरह। पैडेंटिक होने की कोई ज़रूरत नहीं है। कोई भ्रम नहीं है। –

+1

@ रेमंड क्योंकि मैं असहमत हूं। यह आम नहीं है और यह सही नहीं है। * कुछ * भाषाएं स्लेश का उपयोग करती हैं, लेकिन उदाहरण के लिए दो भाषाओं में मैं सबसे परिचित हूं (और जो * बहुत * लोकप्रिय हैं) - जावा और एसक्यूएल - स्लेश का उपयोग नहीं करते हैं। नौसिखिया उपयोगकर्ताओं को स्लेश के बारे में पता नहीं हो सकता है और भ्रमित हो सकता है। यह साइट शुद्धता के लिए प्रयास करती है। तथ्य यह है कि दिया गया जवाब गलत है, भले ही एक स्लैश-उपयोग करने वाली भाषा स्थापित की गई हो (जो यह नहीं है), तकनीकी रूप से यह * अभी भी गलत होगा, क्योंकि स्लेश आवश्यक * रेगेक्स * का हिस्सा नहीं हैं * , और यह सवाल regex के बारे में है। – Bohemian

0

अच्छा क्ष। यहाँ सबसे सरल मैं ऊपर आ सकता है:

^\s*([^\s]{1,3}\s+)*[^\s]{0,3}$ 

स्पष्टीकरण:

  1. ^\s* शुरू में खाली स्थान के लिए किसी भी मात्रा से मेल खाता है।
  2. ([^\s]{1,3}\s+)* एक और तीन गैर-व्हाइटस्पेस वर्णों के बीच समूहों को दोहराते हुए मैच कम से कम एक सफेद स्थान चरित्र के बाद। इसे एक गैर-कैप्चरिंग समूह बनाने के लिए ( के बाद ?: डालने पर विचार करें।
  3. अंतिम [^\s]{0,3} स्ट्रिंग को तीन गैर-व्हाइटस्पेस वर्णों के साथ समाप्त करने की अनुमति देता है (इसलिए इसे 2 द्वारा लागू किए गए व्हाइटस्पेस के साथ समाप्त नहीं होना चाहिए।)

विज़ुअलाइज़ेशन:

Regular expression visualization

डेमो:

टेस्ट इसे यहाँ: Debuggex Demo

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