2011-09-23 14 views
5

पर ऑपरेटर वहाँ "या" इस तरह के Regex.Replace ("abc", के रूप में Regex.Replace पर ऑपरेटर "के लिए एक theorical अभिव्यक्ति आकार सीमा है के लिए एक theorical अभिव्यक्ति आकार सीमा (है एक | सी | डी | ई ... यहां 500000 तत्वों का कहना जारी रखें) "," zzz ")?वहाँ "या" Regex.Replace

.NET के कार्यान्वयन पर कोई स्टैक ओवरफ्लो अपवाद?

धन्यवाद

+2

यदि आप 500000 तत्व लंबे रेगेक्स पैटर्न रखने की योजना बना रहे हैं, तो आप अपने समाधान आर्किटेक्चर पर पुनर्विचार करना चाहेंगे। ;) –

+1

क्या आपका मतलब सैद्धांतिक सीमा है या क्या आपका मतलब व्यावहारिक सीमा है? – Chris

+0

@ क्रिस दोनों। मुझे उस परिस्थिति में भी दिलचस्पी है जहां इसे संकलित किया जाता है। नया रेगेक्स (पैटर्न, RegexOptions.Compiled); – Bamboo

उत्तर

3

कोई सैद्धांतिक सीमा नहीं है, हालांकि प्रत्येक नियमित अभिव्यक्ति इंजन अपने आप ही कार्यान्वयन सीमा होगा। इस मामले में, चूंकि आप .NET का उपयोग कर रहे हैं, इसलिए सीमा .NET रनटाइम का उपयोग कर सकते हैं स्मृति की मात्रा के कारण है।

एक लाख alernations के साथ एक नियमित अभिव्यक्ति मेरे लिए ठीक काम करता है:

string input = "a<142>c"; 
var options = Enumerable.Range(0, 1000000).Select(x => "<" + x + ">"); 
string pattern = string.Join("|", options); 
string result = Regex.Replace(input, pattern, "zzz"); 

परिणाम:

azzzc 

हालांकि यह बहुत धीमी है। 10 मिलियन तक विकल्पों की संख्या में वृद्धि मुझे OutOfMemoryException देता है।

आपको शायद किसी अन्य दृष्टिकोण को देखने से फायदा होगा।

+0

नया रेगेक्स (पैटर्न, RegexOptions.Compiled); ऐसा लगता है कि ठीक है, और जब तक कोई रैम स्पाइक नहीं है। जगह जगह ले ली गई है। शायद यह बैकट्रैकिंग है जो बड़े पैमाने पर राम का उपयोग करता है। आपके समय के लिए धन्यवाद :) – Bamboo

2

नियमित अभिव्यक्ति कार्य का तरीका यह है कि वर्णन की गई सरल a|b|c.....|x|y|z अभिव्यक्ति के लिए स्मृति आवश्यकताओं और प्रदर्शन बहुत खराब नहीं हैं, यहां तक ​​कि बहुत बड़ी संख्या में भी।

हालांकि, यदि आपकी अभिव्यक्ति उससे थोड़ा अधिक जटिल है, तो आप अभिव्यक्ति को तेजी से प्रदर्शन खोने के साथ-साथ बड़े पैमाने पर अपनी मेमोरी पदचिह्न को बढ़ा सकते हैं, क्योंकि or विकल्पों की बड़ी संख्या के कारण यह हो सकता है अगर अभिव्यक्ति के अन्य भाग तुरंत मेल नहीं खाते तो बैकट्रैकिंग की भारी मात्रा में करना।

इसलिए आप सावधानी बरतना चाहते हैं या तो इस तरह की चीज कर रहे हैं। यहां तक ​​कि अगर यह अब काम करता है, तो यह पूरी चीज पीसने के लिए आने के लिए केवल एक छोटा और अपेक्षाकृत निर्दोष परिवर्तन लेगा।

+0

"backreferencing" को "बैकट्रैकिंग" में बदलने के लिए संपादित किया गया, जो मुझे लगता है कि आपका क्या मतलब है। बैकरेफर कुछ और हैं। अगर आप वास्तव में उनके बारे में बात कर रहे थे, तो वापस रोल करने के लिए स्वतंत्र महसूस करें। –

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