2011-11-16 15 views
6

कृपया कोई मुझे बता सकता है कि "_" और अवधि "।" regex का उपयोग कर एक स्ट्रिंग में उत्कृष्टता से एक बार, regex अभिव्यक्ति के बजाय indexOf() का उपयोग करके यह अधिक कुशल है।जावा में रेगेक्स और इंडेक्स की तुलना में इसके प्रदर्शन

String s= "Hello_Wor.ld" or 
s="12323_!£££$.asdfasd" 

bascially वर्णों के किसी भी नहीं से पहले आ सकता है और _ और . के बाद ही आवश्यकता है कि पूरी स्ट्रिंग केवल _ की एक घटना और .

+0

आपको अधिक चिंतित होना चाहिए और इस तरह के इरादे को समझना और समझना आसान है, ज्यादातर तर्कसंगत मामलों में 'रेगेक्स' सीधे मिलान करने वाले मामलों में इस विचार को खो देगा 'रेगेक्स' शायद जीत जाएगा। –

उत्तर

7

indexOf शामिल करना चाहिए एक regex की तुलना में काफी तेज हो जाएगा, और शायद समझने में भी आसान हो जाएगा।

बस indexOf('_') >= 0, और फिर indexOf('_', indexOfFirstUnderScore) < 0 पर परीक्षण करें। अवधि के लिए वही करो।

/^[^.]*\.[^.]*$/ 

_ के लिए एक ही:

कुछ
/^[^_]*_[^_]*/ 

संयुक्त regex होना चाहिए की तरह:

/^([^._]*\.[^._]*_[^._]*)|([^._]*_[^._]*\.[^._]*)$/ 
private boolean containsOneAndOnlyOne(String s, char c) { 
    int firstIndex = s.indexOf(c); 
    if (firstIndex < 0) { 
     return false; 
    } 
    int secondIndex = s.indexOf(c, firstIndex + 1); 
    return secondIndex < 0; 
} 
+0

हां बिल्कुल। सुधारों के लिए धन्यवाद। –

+0

अब मैं सुरक्षित रूप से अपना जवाब हटा सकता हूं! :) –

2

एक भी . साथ एक स्ट्रिंग से मेल खाता है 10 अब यह स्पष्ट होना चाहिए कि indexOf बेहतर समाधान है, सरल होना (प्रदर्शन अप्रासंगिक है जब तक यह बाधा नहीं दिखाया जाता है)।

यदि दिलचस्पी है, तो ध्यान दें कि संयुक्त रेगेक्स के दो शब्द हैं, "एक . से पहले एक _" से पहले स्ट्रिंग और इसके विपरीत। यह तीन पात्रों के लिए छः होगा, और एन! एन के लिए संयुक्त regex का उपयोग करने के बजाय दोनों regexes और परिणाम चलाने के लिए यह आसान होगा।

रेगेक्स का उपयोग करते समय हमेशा एक सरल समाधान की तलाश करनी चाहिए।

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