2009-05-29 16 views
16

में दोहराए गए सबस्ट्रिंग पर मिलान करना क्या रेगेक्स के समान हिस्सों के आधार पर मिलान करने के लिए रेगेक्स संभव है?रेगेक्स

उदाहरण के लिए, मैं अक्षरों के बावजूद, 3 अक्षरों के समान अनुक्रम के साथ शुरू होने और समाप्त होने वाली रेखाओं से कैसे मेल करूंगा?

से मेल खाता है:

abcabc 
xyz abc xyz 

से मेल नहीं खाता:

abc123 

अपरिभाषित: (मेल खाते हैं या नहीं कर सकते, जो भी सबसे आसान है)

ababa 
a 

आदर्श रूप में, मैं चाहूँगा पर्ल रेगेक्स स्वाद में कुछ। यदि यह संभव नहीं है, तो मुझे यह जानने में दिलचस्पी होगी कि क्या कोई स्वाद है कि कर सकते हैं।

उत्तर

19

कैप्चर समूह और बैकरेफर का उपयोग करें।

/^(.{3}).*\1$/ 

\1 जो कुछ भी पहले कैप्चर समूह की सामग्रियों (() की सामग्री) के अनुरूप है करने के लिए वापस संदर्भित करता है। अधिकांश भाषाओं में Regexes इस तरह कुछ की अनुमति देते हैं।

+3

हू, मैं वास्तव में खोज/प्रतिस्थापन के प्रतिस्थापन भाग में वर्षों के लिए कैप्चर समूह और बैक संदर्भों का उपयोग कर रहा हूं। मैंने कभी सोचा नहीं कि मैं उन्हें मूल मिलान पैटर्न में भी उपयोग करने में सक्षम हो सकता हूं। – Whatsit

13

आपको backreferences की आवश्यकता है। विचार पहली बार के लिए कैप्चरिंग समूह का उपयोग करना है, और फिर जब आप अंतिम बिट से मिलान करने का प्रयास कर रहे हैं तो उसे वापस देखें।

<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1> 

इस regex कोष्ठकों का केवल एक जोड़ी है, जो कब्जा पहले backreference में [A-Z][A-Z0-9]* से मिलान स्ट्रिंग: यहाँ (पहले दिए गए लिंक से) एचटीएमएल आरंभ और समाप्ति टैग की एक जोड़ी मिलान का एक उदाहरण है । यह बैकरेफर \1 (बैकस्लैश एक) के साथ पुन: उपयोग किया जाता है। / इससे पहले कि यह बंद होने वाले HTML टैग में आगे की स्लैश है, जिसे हम मिलान करने का प्रयास कर रहे हैं।

अपने मामले को यह आवेदन: (। हां, यह regex कि ब्रायन छिद्रान्वेषी तैनात है सिर्फ यह करने के लिए है कि कई मायनों नहीं हैं।)

/^(.{3}).*\1$/ 

एक विस्तृत विवरण भावी पीढ़ी के लिये (अगर यह आप नीचे है कृपया अपमानित न हों):

  • ^ लाइन के शुरू होने से मेल खाता है।
  • (.{3}) किसी भी प्रकार के तीन अक्षर पकड़ता है और बाद में संदर्भ के लिए उन्हें समूह में सहेजता है।
  • .* जितना संभव हो सके कुछ भी मेल खाता है। (आप परवाह नहीं है क्या लाइन के बीच में है।)
  • \1 समूह चरण में कब्जा कर लिया था 2.
  • $ पंक्ति के अंत से मेल खाता है मेल खाता है।
3

शुरुआत और अंत में एक ही अक्षर के लिए:

/^(.{3}).*\1$/ 

यह एक backreference है।

1

यह काम करता है:

my $test = 'abcabc'; 
print $test =~ m/^([a-z]{3}).*(\1)$/; 

शुरुआत मिलान के लिए और अंत में आप ^ और $ एंकर जोड़ना चाहिए।