2013-03-05 5 views
5

मैं कुछ कोड के प्रदर्शन में सुधार करने की कोशिश कर रहा हूं। यह इस तरह दिखता है:मैं कैसे निर्धारित करूं कि स्ट्रिंग नियमित अभिव्यक्ति नहीं है या नहीं?

public boolean isImportant(String token) { 
    for (Pattern pattern : patterns) { 
     return pattern.matches(token).find(); 
    } 
} 

मैं क्या देखा है पैटर्न के कई कोई नियमित अभिव्यक्ति निर्माणों के साथ सरल स्ट्रिंग शाब्दिक होने लगते हैं कि।

public boolean isImportant(String token) { 
    if (importantList.contains(token)) return true; 

    for (Pattern pattern : patterns) { 
     return pattern.matches(token).find(); 
    }   
} 

मैं प्रोग्राम के रूप में कैसे तय करते हैं कि एक विशेष स्ट्रिंग कोई शामिल हैं: तो मैं, इस प्रकार है जैसे बस इसके स्थान पर कोई और अधिक महंगा पैटर्न मैच प्रदर्शन की एक अलग सूची (importantList) में इन स्टोर और एक समानता परीक्षण करना चाहते हैं नियमित अभिव्यक्ति संरचनाएं?

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

+1

यह निर्धारित करने के लिए एक स्ट्रिंग पर एक नियमित अभिव्यक्ति नहीं करनी चाहिए कि यह नियमित अभिव्यक्ति के रूप में प्रत्येक स्ट्रिंग का उपयोग करने से हर बार एक नियमित अभिव्यक्ति है या नहीं? –

+3

@ माइकएम: वह वह नहीं है जो वह पूछ रहा है। 'हैलो' एक पूरी तरह से वैध regex है। –

+0

संभव नहीं है (कम से कम आसान या सार्थक नहीं, जब तक आपको सादा स्ट्रिंग अक्षर में कुछ पैटर्न नहीं मिलता)। एक साधारण स्ट्रिंग शाब्दिक एक वैध regex पैटर्न है। – AC1

उत्तर

3

यह मुश्किल होगा। आप किसी भी रेगेक्स मेटाएक्टएक्टर्स की उपस्थिति की जांच कर सकते हैं; यह एक अच्छा अनुमान होना चाहिए:

Pattern regex = Pattern.compile("[$^()\\[\\]{}.*+?\\\\]"); 
Matcher regexMatcher = regex.matcher(subjectString); 
regexIsLikely = regexMatcher.find(); 

चाहे यह एक और सवाल है। क्या आप सुनिश्चित हैं कि एक रेगेक्स मैच सूची लुकअप से धीमा है (विशेष रूप से जब आप कई मामलों में इसके बाद रेगेक्स मैच कर रहे हों)? मैं शर्त लगाता हूं कि रेगेक्स मैच को रखने के लिए यह बहुत तेज़ है।

+0

यह वह समाधान है जिसके साथ मैं गया था। दिलचस्प है, मैं प्रसंस्करण समय लगभग 50% कटौती। –

4

मैं सामान्य रूप से जवाब है कि यह कहने से नफरत है लेकिन ...

कि ऐसा मत करो।

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

यदि आपको वास्तव में अपने कोड को अनुकूलित करने की ज़रूरत है, तो संभवतः बहुत अधिक प्रभावी जगहें हैं जहां आप जा सकते हैं।

+0

मैं प्रोफाइलर का इरादा रखता हूं कि अनुकूलन अर्थपूर्ण हैं या नहीं। –

2

इसे निर्धारित करने का कोई तरीका नहीं है क्योंकि प्रत्येक रेगेक्स पैटर्न स्ट्रिंग से कुछ और नहीं है। इसके अलावा वहाँ लगभग regex के रूप में कोई प्रदर्शन अंतर आजकल स्मार्ट है और मैं बहुत यकीन है, अगर पैटर्न और स्रोत लंबाई एक ही हैं, इक्विटी की जांच पहले कि किया जाएगा है

+1

यह निर्भर करता है, लेकिन मैं अनुमान लगाता हूं कि जावा पहले अधिक कुशल डीएफए रेगेक्स करने का प्रयास करता है और केवल अभिव्यक्ति की आवश्यकता होती है (जैसे कि इसमें लुकराउंड शामिल है) –

1

यह गलत है

for (Pattern pattern : patterns) 

आपको एक बड़ा रेगेक्स बनाना चाहिए जो सभी पैटर्न OR OR; फिर प्रत्येक इनपुट के लिए आप केवल एक बार मैच करते हैं।

+0

धन्यवाद। मैंने वास्तव में ऐसा किया और यह पता चला कि एक विशाल पैटर्न का उपयोग करके कई छोटे पैटर्न के मुकाबले लगभग 1/3 तेज था। –

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

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