2009-06-03 15 views
8

के भीतर पुनरावृत्ति का पता लगाने के लिए नियमित अभिव्यक्ति नियमित अभिव्यक्ति के साथ बार-बार संख्या पैटर्न का पता लगाना संभव है?एक स्ट्रिंग

तो उदाहरण के लिए, यदि मेरे पास निम्न स्ट्रिंग "034503450345" है, तो क्या यह दोहराया अनुक्रम 0345 से मेल खाना संभव होगा? मुझे लगता है कि यह रेगेक्स के दायरे से बाहर है, लेकिन मैंने सोचा कि मैं यहां से पूछूंगा कि क्या मुझे कुछ याद आया है या नहीं।

+1

/क्या भाषा मंच आप उपयोग कर रहे हैं? –

+0

मैं सी # का उपयोग कर रहा हूँ। मुझे बस रेगेक्स था, इसलिए मैंने रिचीइंडल के समाधान को लागू किया है, और इसे पहले से ही मेरे टेस्ट डेटा के खिलाफ सत्यापित किया है! मैंने पीटर बोटन के उत्कृष्ट टिप्पणी वाले रेगेक्स से बहुत कुछ सीखा है। आप दोनों को शुक्रिया! –

+0

@ मार्कविचर्स मैं एक ही मुद्दे से निपट रहा हूं। क्या आप कृपया अधिक ठोस हो सकते हैं और मुझे अपने समाधान के बारे में कुछ और बता सकते हैं? धन्यवाद – user2179427

उत्तर

9

हाँ, आप कर सकते हैं - यहाँ एक अजगर परीक्षण का मामला

import re 
print re.search(r"(\d+).*\1", "8034503450345").group(1) 
# Prints 0345 

नियमित अभिव्यक्ति का कहना है "अंक में से कुछ अनुक्रम, तो अन्य सामान की किसी भी राशि है, तो उसी क्रम फिर से पाते हैं।"

एक मुश्किल से संबंधित टिप्पणी पर, यहाँ मेरी पसंदीदा नियमित अभिव्यक्ति में से एक है - अभाज्य संख्या डिटेक्टर:

import re 
for i in range(2, 100): 
    if not re.search(r"^(xx+)\1+$", "x"*i): 
     print i 
+0

आपका प्राइम नंबर डिटेक्टर 0 और 1 प्राइम होने के लिए पाता है :-) – balpha

+0

कोई भी विचार क्यों निम्नलिखित उदाहरण है * केवल * मिलान '8' और' 0345' नहीं? [18] में: foo = re.search (r "। (\ D +) * \ 1", "80345824103452420345") [19] में: foo.groups() बाहर [19]: ('8 ',) –

+0

@balpha: अच्छा पॉन्ट - तय। 8-) – RichieHindle

19

यह अभिव्यक्ति एक या अधिक दोहरा समूहों से मेल खाती जाएगा:

(.+)(?=\1+) 


यहां एक ही अभिव्यक्ति टूटी हुई है, (टिप्पणी का उपयोग करके, इसे अभी भी सीधे रेगेक्स के रूप में उपयोग किया जा सकता है)।

(?x) # enable regex comment mode 
( # start capturing group 
.+ # one or more of any character (excludes newlines by default) 
)  # end capturing group 
(?= # begin lookahead 
\1+ # match one or more of the first capturing group 
)  # end lookahead 


एक विशिष्ट आकार से मिलान करने के लिए, उस पैटर्न, उदा को .+ बदल एक या अधिक संख्याओं के लिए \d+, या \d{4,} 4 या अधिक संख्याओं से मेल खाने के लिए।

पैटर्न की एक विशिष्ट संख्या से मेल खाने के लिए, \1+ बदलें, उदाहरण के लिए \1{4} चार पुनरावृत्ति के लिए।

दोहराव एक दूसरे के बगल में नहीं होने की अनुमति देने के लिए, आप लुकहेड के अंदर .*? जोड़ सकते हैं।

+1

ग्रेट स्पष्टीकरण +1 – ichiban

+0

अच्छा उदाहरण, बहुत अच्छी तरह से समझाया गया –

+0

ग्रेट स्पष्टीकरण। उत्कृष्ट विस्तार धन्यवाद!! +1 – Toto

8

बस RichieHindle से (सही) जवाब के लिए एक नोट जोड़ने के लिए:

ध्यान दें कि जब पायथन के regexp कार्यान्वयन (और कई अन्य, इस तरह के पर्ल के रूप में) यह कर सकते हैं, इस नहीं रह गया है में एक रेगुलर एक्सप्रेशन है शब्द की संकीर्ण भावना।

आपका उदाहरण नियमित भाषा नहीं है, इसलिए शुद्ध नियमित अभिव्यक्ति द्वारा इसे नियंत्रित नहीं किया जा सकता है। उदाहरण देखें विवरण के लिए उत्कृष्ट Wikipedia article

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

यह नहीं कहना कि यह एक अच्छा समाधान नहीं है, लेकिन आपको यह महसूस करना चाहिए कि आप नियमित अभिव्यक्तियों (यहां तक ​​कि विस्तारित रूप में) की सीमा पर हैं, और समस्या के मामले में अन्य समाधानों पर विचार करना चाहेंगे ।

+0

बहुत दिलचस्प पढ़ना, इसके लिए धन्यवाद। –

2

यह सी # कोड है, जो दोहराए गए अंकों को खोजने के लिए बैकरेफर निर्माण का उपयोग करता है। यह 034503450345, 123034503450345, 034503450345345, 232034503450345423 के साथ काम करेगा। रेगेक्स समझने के लिए बहुत आसान और स्पष्ट है।

/// <summary> 
/// Assigns repeated digits to repeatedDigits, if the digitSequence matches the pattern 
/// </summary> 
/// <returns>true if success, false otherwise</returns> 
public static bool TryGetRepeatedDigits(string digitSequence, out string repeatedDigits) 
{ 
    repeatedDigits = null; 

    string pattern = @"^\d*(?<repeat>\d+)\k<repeat>+\d*$"; 

    if (Regex.IsMatch(digitSequence, pattern)) 
    { 
     Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
     repeatedDigits = r.Match(digitSequence).Result("${repeat}"); 
     return true; 
    } 
    else 
     return false; 
} 
+0

बहुत अच्छा! मुझे नामित समूह का उपयोग पसंद है। उत्पादन गुणवत्ता कोड, टिप्पणी की और कॉपी करने के लिए तैयार। बहुत बहुत धन्यवाद! –

+0

"कॉपी करने के लिए तैयार": डी .. मुझे वह पसंद है !!!! –

0

उपयोग regex पुनरावृत्ति: बार {2,} दो या अधिक बार के साथ पाठ के लिए लग रहा है: barbar barbarbar ...