2012-09-17 13 views
12

यह एक उदाहरण स्ट्रिंग है:मैं रेगेक्स मैच वैकल्पिक का हिस्सा कैसे बना सकता हूं?

123456#p654321 

वर्तमान में, मैं इस मैच का उपयोग कर रहा है दो अलग अलग समूहों में 123456 और 654321 कब्जा करने के लिए:

([0-9].*)#p([0-9].*) 

लेकिन कई मौकों पर, स्ट्रिंग के #p654321 हिस्सा वहां नहीं होगा, इसलिए मैं केवल पहले समूह को पकड़ना चाहता हूं। मैंने ? को जोड़कर दूसरा समूह "वैकल्पिक" बनाने की कोशिश की, जो काम करता है, लेकिन शेष स्ट्रिंग के अंत में #p तक केवल तब तक।

इस समस्या को हल करने का सबसे अच्छा तरीका क्या होगा?

उत्तर

33

आपके पास कैप्चरिंग समूह के बाहर #p है, जो इसे परिणाम का एक आवश्यक टुकड़ा बनाता है। आप डॉट कैरेक्टर (.) का अनुचित तरीके से उपयोग कर रहे हैं। डॉट (अधिकांश रेग-एक्स वेरिएंट में) किसी भी चरित्र से मेल खाएगा। यह करने के लिए परिवर्तित करें:

([0-9]*)(?:#p([0-9]*))? 

(?:) वाक्य रचना कैसे आप एक गैर पर कब्जा समूह मिलता है। फिर हम केवल उन अंकों को कैप्चर करते हैं जिनमें आप रुचि रखते हैं। अंत में, हम पूरी चीज़ को वैकल्पिक बनाते हैं।

इसके अलावा, अधिकांश reg-ex भिन्नताओं में \d वर्ण वर्ग के लिए वर्ण वर्ग है। तो अगर आप आगे भी आसान बनाने में कर सकते हैं:

(\d*)(?:#p(\d*))? 

के रूप में किसी अन्य व्यक्ति ने कहा है, * ऑपरेटर संभावित शून्य अंक से मेल खा सकते। इसे रोकने के लिए, बजाय + ऑपरेटर का उपयोग करें:

(\d+)(?:#p(\d+))? 
+0

मुझे लगता है कि पहले से करने की कोशिश की, और यह काम करता है लेकिन अगर कोई स्ट्रिंग के लिए एक दूसरा हिस्सा है तो पहले समूह पूरी स्ट्रिंग है, और कुछ भी नहीं है दूसरा समूह – user1447941

+0

आपके reg-ex में डॉट आपकी समस्या का कारण बन रहा है। मेरा संशोधन देखें। –

+0

और अब दूसरा समूह '# p654321' है। यह दिखता है कि यह समूह मैच का हिस्सा है। – user1447941

4

आपका रेगुलर एक्सप्रेशन से वास्तव में, कोई अंक से मेल खाएगा, क्योंकि आप * बजाय + का उपयोग किया है।
यह वही है (मुझे लगता है कि) है आप चाहते हैं:

(\d+)(?:#p(\d+))? 
+0

आप सही हैं; उपयोग करने के लिए '+' एक बेहतर ऑपरेटर होगा। मैंने उस बदलाव को करने के बारे में सोचा, लेकिन ओपी ने यह निर्दिष्ट नहीं किया कि कोई अंक परिदृश्य संभावना नहीं है या नहीं। इस तरह, मैंने इसे यथासंभव अपने मूल के करीब रखने की कोशिश की। –

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