2009-05-15 13 views
16

आइए कहें कि मुझे एक पैटर्न से मिलान करने की आवश्यकता है यदि यह पंक्ति में 3 या 6 बार दिखाई देता है। सबसे नज़दीक मैं प्राप्त कर सकता हूं \ d {3,6} जैसा कुछ है लेकिन यह मुझे जो कुछ चाहिए उसे पूरा नहीं करता है।नियमित अभिव्यक्तियां: मिलान x बार या y बार

'123' से मेल खाना चाहिए
'123456' से मेल खाना चाहिए
'1234' से मेल नहीं चाहिए

उत्तर

26
^(\d{3}|\d{6})$ 

आप टर्मिनेटर के कुछ प्रकार के लिए अन्यथा \d{3} 1234. से मेल खाएगी है यही कारण है कि मैं डाल दिया है^और ऊपर $।

(?<!\d)(\d{3}|\d{6})(?!\d) 

यह (इस मामले में) से पहले नहीं कर रहा है या इसके बाद एक अंकों द्वारा सुनिश्चित करने के लिए: एक विकल्प lookarounds उपयोग करने के लिए है। Lookahead and Lookbehind Zero-Width Assertions में और अधिक।

+0

यह अच्छा लगता है, धन्यवाद। लेकिन क्या होगा यदि पैटर्न सिर्फ \ d से बहुत बड़ा है? मुझे लगता है कि नियमित अभिव्यक्ति का निर्माण करते समय मैं कुछ स्ट्रिंग इंटरपोलेशन कर सकता था लेकिन उप-पैटर्न का पुन: उपयोग करने का एक बेहतर तरीका है? –

+0

उस स्थिति में आप {1,2} प्रारूप का उपयोग करना चाहते हैं, यानी (() {3}) {1,2} –

5

कैसे के बारे में:

(\d\d\d){1,2} 

हालांकि तुम भी कुछ की तरह दोनों छोर पर गार्ड जो अपने आरई इंजन पर निर्भर करती है, की आवश्यकता होगी:

[^\d](\d\d\d){1,2}[^\d] 

या:

^(\d\d\d){1,2}$ 
1

पहला मैच 3, 6 से मेल खाता है, लेकिन 9, 12, 15, .... दूसरा सही दिखता है। यहां एक और मोड़ है:

\d{3}\d{3}? 
+6

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

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