आप तत्वों का एक सेट का क्रमपरिवर्तन का मिलान करना चाहते हैं, तो आप बैक रेफरेंस और शून्य-चौड़ाई नकारात्मक अग्रेषण मिलान के संयोजन का उपयोग कर सकते हैं।
123-abc-456-def-789-ghi-0AB
123-abc-456-ghi-789-def-0AB
123-def-456-abc-789-ghi-0AB
123-def-456-ghi-789-abc-0AB
123-ghi-456-abc-789-def-0AB
123-ghi-456-def-789-abc-0AB
आप निम्न regex के साथ ऐसा कर सकते हैं::
/123-(abc|def|ghi)-456-(?!\1)(abc|def|ghi)-789-(?!\1|\2)(abc|def|ghi)-0AB/
वापस संदर्भ (\1
, \2
), तो आपको जाने
आप इन छह लाइनों में से किसी एक का मिलान करना चाहते कहो अपने पिछले मैचों का संदर्भ लें, और शून्य चौड़ाई आगे मिलान ((?!...)
) आपको स्थितित्मक मिलान को अस्वीकार करने देता है, यह कहकर मेल नहीं खाता कि इस स्थिति में निहित मिलान है। दोनों का संयोजन यह सुनिश्चित करता है कि आपका मैच किसी दिए गए तत्वों का एक वैध क्रमपरिवर्तन है, प्रत्येक संभावना केवल एक बार होती है।
तो, उदाहरण के लिए, माणिक में:
input = <<LINES
123-abc-456-abc-789-abc-0AB
123-abc-456-abc-789-def-0AB
123-abc-456-abc-789-ghi-0AB
123-abc-456-def-789-abc-0AB
123-abc-456-def-789-def-0AB
123-abc-456-def-789-ghi-0AB
123-abc-456-ghi-789-abc-0AB
123-abc-456-ghi-789-def-0AB
123-abc-456-ghi-789-ghi-0AB
123-def-456-abc-789-abc-0AB
123-def-456-abc-789-def-0AB
123-def-456-abc-789-ghi-0AB
123-def-456-def-789-abc-0AB
123-def-456-def-789-def-0AB
123-def-456-def-789-ghi-0AB
123-def-456-ghi-789-abc-0AB
123-def-456-ghi-789-def-0AB
123-def-456-ghi-789-ghi-0AB
123-ghi-456-abc-789-abc-0AB
123-ghi-456-abc-789-def-0AB
123-ghi-456-abc-789-ghi-0AB
123-ghi-456-def-789-abc-0AB
123-ghi-456-def-789-def-0AB
123-ghi-456-def-789-ghi-0AB
123-ghi-456-ghi-789-abc-0AB
123-ghi-456-ghi-789-def-0AB
123-ghi-456-ghi-789-ghi-0AB
LINES
# outputs only the permutations
puts input.grep(/123-(abc|def|ghi)-456-(?!\1)(abc|def|ghi)-789-(?!\1|\2)(abc|def|ghi)-0AB/)
पांच तत्वों का क्रमपरिवर्तन के लिए, यह होगा:
/1-(abc|def|ghi|jkl|mno)-
2-(?!\1)(abc|def|ghi|jkl|mno)-
3-(?!\1|\2)(abc|def|ghi|jkl|mno)-
4-(?!\1|\2|\3)(abc|def|ghi|jkl|mno)-
5-(?!\1|\2|\3|\4)(abc|def|ghi|jkl|mno)-6/x
अपने उदाहरण के लिए, regex होगा
/<a href="home.php" (class="link"|title="Home") (?!\1)(class="link"|title="Home")>Home<\/a>/
मुझे @ जोश बुश का जवाब बहुत नीचे है जैसा कि अब मेरे लिए काम कर रहा है कि मैं इस – Rick
पर आया, नहीं, आप इसे नहीं कर सकते। यही कारण है कि आप ** HTML (या XML) को पार्स करने के लिए नियमित अभिव्यक्तियों का उपयोग नहीं करते हैं। एक उचित एचटीएमएल पार्सिंग मॉड्यूल का प्रयोग करें। ** आप विश्वसनीय अभिव्यक्तियों के साथ एचटीएमएल को विश्वसनीय रूप से पार्स नहीं कर सकते हैं, और आपको सड़क के नीचे दुःख और निराशा का सामना करना पड़ेगा। जैसे ही आपकी अपेक्षाओं से HTML बदल जाता है, आपका कोड टूटा जाएगा। Http: // htmlparsing देखें।PHP मॉड्यूल के साथ HTML को सही तरीके से पार्स करने के उदाहरणों के उदाहरण के लिए com/php जो पहले से ही लिखे गए, परीक्षण और डिबग किए गए हैं। –
यह कई कारणों में से एक है रेगेक्स एक्सएमएल या एचटीएमएल को पार्स करने के लिए उपयुक्त नहीं हैं। –