2010-09-23 5 views
11

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

कोई विचार?

संपादित: क्षमा करें, स्पष्ट करने के लिए, मैं इसे ही चरित्र पांच बार से अधिक, पांच पात्रों में से नहीं किसी भी क्रम दोहराया का पता लगाने की जरूरत है। और मुझे किसी भी चार्टर के साथ काम करने की भी आवश्यकता है, न केवल मेरे उदाहरण में "ओ"। "। {5,}" कोई अच्छा नहीं है क्योंकि यह किसी भी पांच वर्णों के किसी भी अनुक्रम का पता लगाता है, न कि एक ही चरित्र।

+0

[10 बार से अधिक बार दोहराए जाने वाले किसी भी चरित्र से मिलान करने के लिए नियमित अभिव्यक्ति] के संभावित डुप्लिकेट को भी देखें (http://stackoverflow.com/questions/1660694/regular-expression-to-match-any-character-being-repeated 10 से अधिक बार) – Bergi

उत्तर

23

का उपयोग करके पत्र के लिए सीमित कर सकते हैं यह है कि यह

(\w)\1{5,} 
  • (\w) मैच किसी भी चरित्र करते हैं और पहले में रख चाहिए समूह
  • \1{5,} जांचें कि पहला समूह कम से कम 5 बार मैच करता है।

उपयोग:

$input = 'helloooooooooo'; 
if (preg_match('/(\w)\1{5,}/', $input)) { 
# Successful match 
} else { 
# Match attempt failed 
} 
+0

आप पूरी तरह से सही हैं, मैंने 5 से अधिक दोहराव से मेल खाने के लिए अपना जवाब तय कर दिया है। –

+0

बिल्कुल सही, धन्यवाद! इसे ठीक करने के लिए –

+0

+1। – eldarerathis

11

सुधार, (.)\1{5,} होना चाहिए, मुझे विश्वास है। मेरी गलती। यह आपको हो जाता है:

(.) #Any character 
\1 #The character captured by (.) 
{5,} #At least 5 more repetitions (total of at least 6) 

तुम भी (\w)\1{5,} या ([a-zA-Z])\1{5,}

+0

यह * "हैलो" *, * "अलविदा" *, या चार वर्णों से अधिक की किसी भी अन्य स्ट्रिंग से भी मेल खाएगा। – LukeH

+0

@LukeH: निश्चित रूप से उस पर दूरी। धन्यवाद। – eldarerathis

+0

यह काम करेगा, लेकिन ध्यान दें कि "।" Linebreaks को छोड़कर हर एक चरित्र से मेल खाता है। इसमें व्हाइटस्पेस, संख्याएं, आदि शामिल हैं – Powertieke

0

आप regex का उपयोग कर सकते हैं:

(.)\1{5,} 

स्पष्टीकरण:

  • .: मेटा चार है कि किसी भी चार मेल खाता है।
  • (): समूहबद्ध और मिलान किए गए सिंगल चार को याद रखने के लिए उपयोग किया जाता है।
  • \1: एकल char का पिछला संदर्भ जो पिछला चरण में याद किया गया था।
  • {5,}: 5 या अधिक

के लिए और PHP में आप के रूप में उपयोग कर सकते हैं परिमाणक:

$input = 'helloooooooooo'; 
if(preg_match('/(.)\1{5,}/',$input,$matches)) { 
    echo "Found repeating char $matches[1] in $input"; 
} 

आउटपुट:

Found repeating char o in helloooooooooo 
1

हां।

(.)\1+ 

यह किसी भी चरित्र के बार-बार अनुक्रमों से मेल खाता है।

\1 ब्रैकेट के पहले सेट की सामग्री को देखता है। (इसलिए यदि आपके पास अधिक जटिल रेगेक्स है, तो आपको इसे सही संख्या में समायोजित करने की आवश्यकता होगी ताकि यह ब्रैकेट के सही सेट को उठा सके)।

आपको यह निर्दिष्ट करने की जरूरत है, का कहना है कि एक से अधिक उनमें से तीन:

(.)\1{3,} 

\ 1 वाक्य रचना काफी शक्तिशाली है - जैसे तुम भी इसे कहीं और अपने regex में एक ही चरित्र प्रदर्शित होने के लिए खोज करने के लिए उपयोग कर सकते हैं अपनी खोज स्ट्रिंग में विभिन्न स्थानों पर।

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