2008-10-06 17 views
47

से मेल खाने के लिए रेगेक्स मेरे पास URL है, और मैं इसे कुछ समूहों को खींचने के लिए नियमित अभिव्यक्ति से मिलान करने की कोशिश कर रहा हूं। मेरी समस्या यह है कि यूआरएल या तो या समाप्त हो सकता है "/" ​​और अधिक यूआरएल टेक्स्ट के साथ जारी रखें। मैं इस तरह URL का मिलान करना चाहते हैं:यूआरएल एंड-लाइन या "/" वर्ण

लेकिन कुछ इस तरह से मेल नहीं:

तो, मैंने सोचा था कि मेरे सबसे अच्छे शर्त कुछ इस तरह था:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$] 

जहां अंत में चरित्र वर्ग निहित या तो "/" या अंत के लाइन। हालांकि चरित्र वर्ग "$" से खुश नहीं प्रतीत होता है। सही समूहों को वापस खींचते समय मैं इन यूआरएल के बीच सबसे अच्छा भेदभाव कैसे कर सकता हूं?

उत्तर

37
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$ 
+0

एस्केपिंग के बिना इस काम करता है हाइफ़न? – ziggy

85

या तो मिलान करने के लिए/या सामग्री के अंत में, का उपयोग (/|\z)

यह केवल लागू होता है अगर आप बहु लाइन मिलान का उपयोग नहीं कर रहे हैं (यानी आप किसी एकाधिक URL मिलान कर रहे हैं, नहीं एक नई पंक्ति पृथक सूची यूआरएल के)।


कि आपने क्या खाया के एक अद्यतन संस्करण के साथ कि डाल करने के लिए:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z) 

ध्यान दें कि मैं शुरू में बदल दिया है गैर-सफ़ेद (\S+?) के बजाय मिलान के लिए एक गैर लालची मैच होने के लिए कुछ भी और सबकुछ (.*)

+4

मैं आपको और अधिक बिंदु कैसे दे सकता हूं;) इसके लिए धन्यवाद। बस दस्तावेज़ (/ | \ ए) आगे स्लैश या स्ट्रिंग की शुरुआत से मेल खाता है। –

48

आपके पास अब कुछ दोबारा मिल गया है जो आप चाहते हैं, जो कि पर्याप्त रूप से कवर किया गया है। क्या उल्लेख नहीं किया गया है यही कारण है कि आपके प्रयास काम नहीं करेगा: एक चरित्र वर्ग के अंदर, $ (। और साथ ही ^, , और /) कोई विशेष अर्थ नहीं है, इसलिए [/ $ ] मैचों या तो एक शाब्दिक / या एक शाब्दिक $ बल्कि regex (/) को समाप्त या अंत के लाइन ($) मिलान से।

+5

यह अक्सर कुछ भूल गया है और रेगेक्स दस्तावेज़ों में उल्लिखित नहीं है। –

+4

ध्यान दें कि^एक चरित्र वर्ग में विशेष अर्थ हो सकता है। यदि यह कक्षा में पहला चरित्र है, तो यह इसे एक नकारात्मक वर्ग बनाता है जो अन्य पात्रों को छोड़कर कुछ भी मेल खाता है। जैसे ए या बी को छोड़कर कुछ भी मिलान करने के लिए, आप [^ ab] का उपयोग कर सकते हैं। एक शाब्दिक^शामिल करने के लिए, बस सुनिश्चित करें कि यह पहले नहीं है, इसलिए ए, बी या^से मिलान करने के लिए आप [ab ^] का उपयोग करेंगे। –

7

रूबी और बैश में, आप $ का उपयोग ब्रांड्स के अंदर कर सकते हैं।

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$) 

(यह समाधान पीट Boughton के लिए समान है, लेकिन $ के उपयोग, जो पंक्ति के अंत का मतलब है, बल्कि \z का उपयोग करने से, जो स्ट्रिंग के अंत का मतलब है बरकरार रखता है।)

+2

PHP जो भी मैं बता सकता हूं उससे भी। मुझे कोई कारण नहीं दिख रहा है कि वास्तव में किसी भी कार्यान्वयन में '$ 'कोष्ठक'()' में उपयोग नहीं किया जा सकता है। यह ब्रैकेट '[]' है जो इसे शाब्दिक बनाता है। –

+2

'$' जावास्क्रिप्ट में इस तरह से काम करता है, जबकि '\ z' नहीं (क्रोम 48, फ़ायरफ़ॉक्स 43, आईई 9)। –

+1

यह सबसे सीधा-आगे विकल्प है। स्लैश या अंत-रेखा मैच। यह इस सवाल के शीर्षक से भी मेल खाता है! –

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