2008-08-07 14 views
15

मैं सी # में एक टेलनेट क्लाइंट लिख रहा हूं और मुझे जो विश्लेषण करना है वह हिस्सा एएनएसआई/वीटी 100 एस्केप अनुक्रम हैं, विशेष रूप से, केवल रंग और स्वरूपण के लिए उपयोग किए जाने वाले (विस्तृत here)।यह नियमित अभिव्यक्ति तेज़ी से क्यों है?

एक विधि मेरे पास एक सभी कोड को खोजने और उन्हें हटाने के लिए है, इसलिए यदि आवश्यक हो तो मैं किसी भी स्वरूपण के बिना पाठ प्रस्तुत कर सकते हैं:

 
public static string StripStringFormating(string formattedString) 
{ 
    if (rTest.IsMatch(formattedString)) 
     return rTest.Replace(formattedString, string.Empty); 
    else 
     return formattedString; 
} 

मैं नियमित अभिव्यक्ति के लिए नया हूँ और मैं करने के लिए सुझाव दिया गया था इसका उपयोग करें:

static Regex rText = new Regex(@"\e\[[\d;]+m", RegexOptions.Compiled);

हालांकि, सर्वर पर किसी त्रुटि के कारण एस्केप कोड अपूर्ण होने पर यह विफल रहा। तो फिर इस सुझाव दिया गया था, लेकिन मेरे दोस्त ने चेतावनी दी है कि यह धीमी हो सकती है (यह एक भी एक और शर्त (z) है कि मैं बाद में देखने को मिल सकते मेल खाता है):

static Regex rTest = 
       new Regex(@"(\e(\[([\d;]*[mz]?))?)?", RegexOptions.Compiled);

यह न केवल काम किया, लेकिन करने के लिए तेजी से वास्तव में था और मेरे पाठ प्रतिपादन पर प्रभाव कम कर दिया। क्या कोई रेगेक्सपी नौसिखिया को समझा सकता है, क्यों? :)

उत्तर

1

विस्तृत विश्लेषण किए बिना, मुझे लगता है कि प्रश्न चिह्नों के कारण यह तेज़ है। ये नियमित अभिव्यक्ति को "आलसी" होने की अनुमति देते हैं, और जैसे ही इनपुट मिलान के बाकी हिस्सों की जांच करने के बजाय, मिलान करने के लिए पर्याप्त रूप से बंद हो जाते हैं।

हालांकि मैं इस उत्तर से पूरी तरह से खुश नहीं हूं, क्योंकि यह ज्यादातर * या + के बाद प्रश्न चिह्नों पर लागू होता है। अगर मैं इनपुट से ज्यादा परिचित था, तो यह मेरे लिए अधिक समझ में आ सकता है।

क्यों # 1 धीमी है कारण (इसके अलावा, कोड स्वरूपण के लिए, आप अपने कोड के सभी का चयन करें और दबा सकते हैं Ctrl +कश्मीर यह आवश्यक चार खाली स्थान है।)

3

कि [\ d;] + एक लालची क्वांटिफायर है। + का उपयोग करना? या *? आलसी मात्रात्मक करने जा रहा है। अधिक जानकारी के लिए MSDN - Quantifiers देखें।

आप कोशिश करना चाहते हो सकता है:

"(\e\[(\d{1,2};)*?[mz]?)?" 

कि तेजी से आप के लिए हो सकता है।

3

क्या आप वास्तव में दो बार regexp चलाने के लिए चाहते हैं? बिना चेक करने के बाद (बुरा मुझे) मैंने सोचा होता है कि यह अच्छी तरह से काम करेगा:

public static string StripStringFormating(string formattedString) 
{  
    return rTest.Replace(formattedString, string.Empty); 
} 

यदि ऐसा है, आप इसे चलाने ~ दोगुनी गति से देखना चाहिए ...

+0

यह अब के बारे में सोच रही थी, मतलब है कि, कोई मेल नहीं के साथ एक लाइन पर एक regexp चलाने का पहला एक जांच चल रूप में ही है देखें कि यह बिल्कुल मेल खाता है या नहीं। आपको एक ही परिणाम मिलते हैं! – Nidonocu

1

मैं अगर यकीन नहीं है इससे आप जो काम कर रहे हैं उसके साथ मदद मिलेगी, लेकिन बहुत पहले मैंने एएनएसआई ग्राफिक फाइलों को पार्स करने के लिए एक नियमित अभिव्यक्ति लिखी थी।

(?s)(?:\e\[(?:(\d+);?)*([A-Za-z])(.*?))(?=\e\[|\z) 

यह प्रत्येक कोड और उसके साथ जुड़े पाठ को वापस कर देगा।

इनपुट स्ट्रिंग:

<ESC>[1;32mThis is bright green.<ESC>[0m This is the default color. 

परिणाम:

[ [1, 32], m, This is bright green.] 
[0, m, This is the default color.] 
+0

इस उत्तर के लिए धन्यवाद, मैं इस अभिव्यक्ति को हाथ में रखूंगा जब मुझे कोई संदेह नहीं होगा और बाद में संभावित सुधारों के लिए कोड की समीक्षा करें। :) जैसा कि मैंने पाया है, 'बड़े' regexps छोटे से तेजी से होते हैं। – Nidonocu

+0

मुझे .NET में एएनएसआई कोड के साथ आप जो कुछ भी कर रहे हैं उसमें भी रूचि है। मैं वर्तमान में .NET की बजाय रेल में अपनी साइट को फिर से शुरू कर रहा हूं, लेकिन मैं हमेशा यह देखने के लिए उत्सुक हूं कि लोग एएनएसआई की व्याख्या के लिए .NET का लाभ उठाने में सक्षम कैसे हैं। – lordscarlet