यह नियमित अभिव्यक्ति तेज़ी से क्यों है?

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

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

    
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);

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

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

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

0

4 उत्तर

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

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

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

0
जोड़ा

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

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

यदि ऐसा होता है, तो आपको इसे दो बार तेजी से चलाना चाहिए ...

0
जोड़ा
अब इसके बारे में सोचते हुए, यह समझ में आता है, किसी भी मैचों वाले लाइन पर रेगेक्सप चलाने से पहले यह जांचने के लिए एक चेक चलाने जैसा ही होता है कि यह बिल्कुल मेल खाता है या नहीं। आपको एक ही परिणाम मिलते हैं!
जोड़ा लेखक Nidonocu, स्रोत

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

आप कोशिश कर सकते हैं:

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

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

0
जोड़ा

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

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

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

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

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

परिणाम:

[ [1, 32], m, This is bright green.]
[0, m, This is the default color.]
0
जोड़ा
इस उत्तर के लिए धन्यवाद, मैं इस अभिव्यक्ति को हाथ में रखूंगा जब मुझे कोई संदेह नहीं होगा और बाद में संभावित सुधारों के लिए कोड की समीक्षा करें। :) जैसा कि मैंने पाया है, 'बड़े' regexps छोटे से तेजी से होते हैं।
जोड़ा लेखक Nidonocu, स्रोत
मैं .NET में एएनएसआई कोड के साथ जो कुछ भी कर रहा हूं उसमें भी रूचि रखता हूं। मैं वर्तमान में .NET की बजाय रेल में अपनी साइट को फिर से शुरू कर रहा हूं, लेकिन मैं हमेशा यह देखने के लिए उत्सुक हूं कि लोग एएनएसआई की व्याख्या के लिए .NET का लाभ उठाने में सक्षम कैसे हैं।
जोड़ा लेखक lordscarlet, स्रोत