2009-06-15 15 views
5

मैं एल्विस को खोजने के लिए काम सौंपा गया है (ग्रहण खोज का उपयोग)। क्या कोई रेगेक्स है जिसे मैं ढूंढने के लिए उपयोग कर सकता हूं?ढूँढना एल्विस:

"एल्विस ऑपरेटर" (?:) जावा के टर्नरी ऑपरेटर की कमी है।

मैंने \?[\s\S]*[:] की कोशिश की है लेकिन यह multiline से मेल नहीं खाता है।
क्या ऐसा कोई रिफैक्टरिंग है जहां मैं एल्विस को किसी अन्य ब्लॉक में बदल सकता हूं?

+3

क्या यह ग्रोवी में है? यदि ऐसा है, तो आप वास्तव में मदद करेंगे अगर आप ऐसा कहेंगे। (यह वास्तव में जावा में सशर्त ऑपरेटर, btw है -।। "त्रिगुट" बस का वर्णन करता है यह कितने ऑपरेंड है यह * एक * त्रिगुट ऑपरेटर, और वर्तमान में केवल एक ही है, लेकिन इसके नाम सशर्त ऑपरेटर है) –

+7

जॉन स्कीट एल्विस है। – abmv

+0

ग्रोवी संदर्भ को देखते हुए, यह बाइनरी ऑपरेटर के मूल्य को कॉल करता है:? मूल्य 'एल्विस ऑपरेटर, और टर्नरी ऑपरेटर' बूलियन? मान: मान 'ए' पारंपरिक टर्नरी ऑपरेटर "। आप एल्विस ऑपरेटर, या एक सशर्त ऑपरेटर बारे में बात कर रहे हैं? यदि यह एल्विस ऑपरेटर है, तो आप केवल "?:" –

उत्तर

4

संपादित क्षमा करें, मैं, त्रिगुट ऑपरेटर के लिए एक regex था यदि आपकी समस्या बहु आप इस का उपयोग कर सकता है:

\?(\p{Z}|\r\n|\n)*:
+2

स्ट्रिंग हैलो = "मैं एक 'एल्विस ऑपरेटर नहीं हूं'? क्या आप: निश्चित रूप से अनिश्चित हैं"; – workmad3

+8

"मुझे पता है, मैं नियमित अभिव्यक्ति का उपयोग करेंगे!" अब आप है 2 समस्याओं ... –

+0

स्ट्रिंग BBCode = "हुह? भ्रमित:" – Svante

2

आप स्पष्ट रूप से लाइन सीमांकक मिलान करने के लिए यदि आप चाहते हैं की आवश्यकता होगी कई लाइनों से मेल खाते हैं। \ R किसी भी (प्लेटफॉर्म-स्वतंत्र) से मेल खाता है, ग्रहण 3.4 में वैसे भी, या आप अपनी फ़ाइल (\ r, \ n, \ r \ n) के लिए उचित उपयोग कर सकते हैं। जैसे \?.*\R*.*: काम करेगा यदि केवल एक लाइन ब्रेक है। आप किसी चरित्र वर्ग में \ R का उपयोग नहीं कर सकते हैं, हालांकि, यदि आप नहीं जानते कि ऑपरेटर कितनी लाइनें फैल सकता है, तो आपको अपनी लाइन डिलीमीटर और किसी भी चरित्र के साथ एक वर्ण वर्ग बनाना होगा जो किसी में दिखाई दे सकता है संकार्य। कुछ ([-\r\n\w\s\[\](){}=!/%*+&^|."']*)\?([-\r\n\w\s\[\](){}=!/%*+&^|."']*):([-\r\n\w\s\[\](){}=!/%*+&^|."']*) की तरह। मैंने ऑपरेंड को समूह के रूप में कैप्चर करने के लिए ब्रांड्स शामिल किए हैं ताकि आप ढूंढ सकें और प्रतिस्थापित कर सकें।

आपको एक बहुत बड़ी समस्या मिली है, हालांकि, यदि यह जावा है (और शायद कोई अन्य भाषा)। टर्नरी सशर्त?: ऑपरेटर एक अभिव्यक्ति बनाता है, जबकि एक अगर कथन अभिव्यक्ति नहीं है। विचार करें:

boolean even = true; 
int foo = even ? 2 : 3; 
int bar = if (even) 2 else 3; 

तीसरी पंक्ति वाक्य रचनात्मक रूप से गलत है; दो सशर्त संरचना बराबर नहीं हैं। (यदि आप मेरे रेगेक्स को खोजने और बदलने के लिए वास्तव में दूसरी पंक्ति से प्राप्त करते हैं तो if (int foo = even) 2 else 3; है जिसमें अतिरिक्त समस्याएं हैं।)

तो, आप उपरोक्त रेगेक्स के साथ ऑपरेटरों को ढूंढ सकते हैं (या कुछ समान; हो सकता है कि मैंने कक्षा में शामिल करने के लिए आपको कुछ पात्रों को याद किया हो), लेकिन आप उन्हें 'if' कथन के साथ प्रतिस्थापित करने में सक्षम नहीं होंगे।

+0

'पूर्णांक foo = भी? 2: 3; 'कुछ (अगर) {int foo = 2; } else {int foo = 3; }; 'अधिकांश सी जैसी भाषाओं में। – Svante

+0

@Swante foo के दायरे गलत मैं लगता है कि होगा। यदि आप इसे/else के बाहर उपयोग नहीं कर पाएंगे – David

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