2015-11-24 4 views
7

मैं किसी विशिष्ट शब्द (उदाहरण के लिए, सी */ में समापन टिप्पणी) से कुछ भी मिलान करना चाहता हूं, हालांकि, प्रदर्शन कारणों से मैं उपयोग नहीं करना चाहता गैर लालची ऑपरेटरों के।रेगेक्स शब्द तक कुछ भी मेल खाता है - गैर-लालची ऑपरेटरों के बिना

उदा।, सी टिप्पणियों से मेल खाने के लिए: /\*.*?\*/ मेरी फ़ाइलों के लिए बहुत धीमी है। प्रदर्शन में सुधार करने की कोई संभावना है?

+0

लालची बनाम नोंग्री का उपयोग करने का प्रदर्शन टिप्पणी की लंबाई पर निर्भर हो सकता है। –

उत्तर

7

ज़रूर, का उपयोग unrolling-the-loop technique:

/\*[^*]*(?:\*(?!/)[^*]*)*\*/ 

देखें regex demo

पाश तकनीक unrolling परिकल्पना है कि ज्यादातर मामले में, आप एक repeteated प्रत्यावर्तन, में kown जो मामले होना चाहिए पर आधारित है सबसे सामान्य और कौन सा असाधारण है। हम पहले व्यक्ति, सामान्य मामला और दूसरा, विशेष मामला बुलाएंगे। पाश तकनीक unrolling के सामान्य वाक्य रचना तो के रूप में लिखा जा सकता है:

normal* (special normal*)*

कौन कर सकता है इसका मतलब है कुछ की तरह, सामान्य मामले से मेल खाते हैं, तो आप एक विशेष मामला पाते हैं, सामान्य मामले फिर से मेल खाते हैं की तुलना में यह मेल नहीं खाते । आप देखते हैं कि इस वाक्यविन्यास का हिस्सा संभावित रूप से एक सुपर-रैखिक मैच की ओर ले जा सकता है। संलग्न करने के लिए एक neverending मैच से बचने के लिए, निम्न नियमों को ध्यान से लागू किया जा shoud:

  • विशेष मामला और सामान्य मामले की शुरुआत परस्पर अनन्य
  • विशेष हमेशा से मेल खाना चाहिए होना चाहिए कम से कम एक चरित्र
  • विशेष अभिव्यक्ति परमाणु होना चाहिए: इस तथ्य से सावधान रहें कि (special normal*)* को (special)* तक घटाया जा सकता है, यदि विशेष special* है, तो यह (a*)* जैसा होता है जो एक अनिश्चित अभिव्यक्ति है।

सी # पैटर्न घोषणा (शब्दशः स्ट्रिंग शाब्दिक उपयोग करते हुए):

var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/"; 

regex टूटने:

  • /\* - शाब्दिक /*
  • [^*]* - 0 या अधिक चरित्र अन्य *
  • से
  • (?:\*(?!/)[^*]*)* - 0 या अधिक अनुक्रम ...
    • \*(?!/) - से *
  • \*/ अन्य 0 या अधिक चरित्र - - शाब्दिक */

यहाँ है एक ग्राफ दिखा कैसे कुशल एक शाब्दिक */

  • [^*]* द्वारा पीछा नहीं 3 संभावित समान रेगेक्सप्स (regexhero.net * पर परीक्षण किया गया है):

    enter image description here

    * /* Comment * Typical * Comment */

  • +0

    कूल। अनोलिंग-द-लूप के बारे में नहीं पता था। धन्यवाद। इसके लिए +1। –

    +0

    "अनोलिंग-द-लूप तकनीक" के लिए ... +1 – Stephan

    +1

    महान उत्तर के लिए धन्यवाद! –

    1

    के खिलाफ परीक्षण किया गया यह प्रयास करें:

    /\*(?:[^*]|\*(?!/))*\*/

    मैं नहीं जानता कि क्या यह stribizhev के जवाब से तेज है।

    +0

    यह '/ \ * (?: [^ *] | \ * [^ /]) * \ * /' Regex मेल नहीं करेगा [इस टिप्पणी] (https://regex101.com/r/lK9yE7/1) '' \ * '' के बाद '[^ /]' अस्वीकृत वर्ण वर्ग के कारण '** /' में समाप्त हो रहा है। तो, भले ही यह तेज़ हो, यह मिलान करने में बस अलग है। हालांकि, वैकल्पिकता के कारण अनोलिंग-द-लूप रेगेक्स की तुलना में वैध मिलान को वापस करने के लिए इसे और अधिक कदमों की आवश्यकता है। –

    +0

    @stribizhev वास्तव में। आपका अधिकार। मैंने अपना नमूना बदल दिया। –

    +0

    अच्छा, अब वे जो मेल खाते हैं, उनके समान हैं, लेकिन अनियंत्रित संस्करण की तुलना में वैकल्पिकता के लिए अभी भी बहुत अधिक बैकट्रैकिंग की आवश्यकता है। –

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