c# - Question on Whitespace Filter Regex (it's simple, just a small addition needed) -
मेरे पास एक asp.net mvc अनुप्रयोग पर एक रेगेक्स आधारित श्वेतस्थान फिल्टर है, और यह पूरी तरह से पूरी तरह से काम करता है, बहुत अच्छी तरह से। चीजें जो फ़िल्टर्ड हो जाती हैं, उनमें से एक \ r \ n वर्ण हैं। यह प्रभावी रूप से एक ही स्रोत कोड की एक पंक्ति में सब कुछ बनाती है, जो मुझे पसंद है क्योंकि मुझे व्हाट्सएस की वजह से विचित्र सीएसएस का सामना करना पड़ता है, लेकिन कुछ मामलों में मुझे उन्हें बनाए रखने की आवश्यकता है। एक उदाहरण यह है कि जब मैं लिटररी में टेक्स्ट को लाइन ब्रेक के साथ प्रदर्शित करना चाहता हूं, जैसे कि नोट।
ऐसा करने के लिए, मैं स्पष्ट रूप से इसे & lt; pre & gt; & lt; / pre & gt;
टैग, लेकिन टैग के बीच में टेक्स्ट के लाइनब्रेट को भी साफ़ किया जाता है, इसलिए यह उदाहरण के लिए एक नोट बनाता है, पढ़ने के लिए मुश्किल है।
रेगेक्स ज्ञान के साथ कोई भी हो सकता है (मेरा बहुत गरीब ...) वर्तमान रेगेक्स को & lt; पूर्व & gt;
टैग के बीच पाठ को अनदेखा करने में मेरी मदद करें
यहां वर्तमान कोड है:
सार्वजनिक वर्ग व्हाइरस्पेसफ़िल्टर: मेमोरीस्ट्रीम {निजी स्ट्रिंग स्रोत = स्ट्रिंग। खाली; निजी स्ट्रीम फ़िल्टर = शून्य; सार्वजनिक व्हाइसेस्पेसफ़िल्टर (एचटीपीआरपीएसपैसबेस एचटीटीपीपीएसबेसबेस) {फ़िल्टर = एचटीटीपीआरपीएसपैसबेस। फ़िलटर; } सार्वजनिक ओवरराइड शून्य लिखें (बाइट [] बफर, पूर्णांक ऑफसेट, पूर्णांक संख्या) {स्रोत = UTF8Encoding.UTF8.GetString (बफर); स्रोत = नया रेगेक्स ("\\ t", रेगेक्सओशंस। कॉम्पैल्टेड | रेगेक्सऑपशंस। मल्टीलाइन)। बदलें (स्रोत, स्ट्रिंग.एप्टी); स्रोत = नया रेगेक्स ("& gt; \\ r \\ n & lt;", RegexOptions.Compiled | RegexOptions.Multiline)। बदलें (स्रोत, "& gt; & lt;"); स्रोत = नया Regex ("\\ r \\ n", RegexOptions.Compiled | RegexOptions.Multiline)। बदलें (स्रोत, string.Empty); जबकि (नया रेगेक्स ("", रेगेक्स ऑप्शंस। कॉम्पेटेड | रेगेक्सऑप्टिस। मल्टीलाइन)। आईएमएस मैक (स्रोत)) (स्रोत = नया रेगेक्स ("", रेगेक्सओशंस। कॉम्पेटेड | रेगेक्सऑप्टिस। मल्टीलाइन)। बदलें (स्रोत, स्ट्रिंग.एप्टी); }; स्रोत = नया रेगेक्स ("& gt; \\ s & lt;", RegexOptions.Compiled | RegexOptions.Multiline)। बदलें (स्रोत, "& gt; & lt;"); स्रोत = नया रेगेक्स ("& lt;! -। *? - & gt;", रेगेक्सओशंस। कॉम्पैटेड | रेगेक्स ऑप्शन। सिंगललाइन)। बदलें (स्रोत, स्ट्रिंग.एप्टी); फ़िल्टर। लिखें (UTF8Encoding.UTF8.GetBytes (स्रोत), ऑफ़सेट, UTF8Encoding.UTF8.GetByteCount (स्रोत)); अग्रिम धन्यवाद!
ऐसे उपकरण हैं जैसे पहले से ही बाहर सफेद स्थान पट्टी करने के लिए। और जैसे इशूमा ने कहा, अगर यह वेब अनुकूलन के लिए है तो अगर आप इसे वेब सर्वर पर कॉन्फ़िगर करते हैं, तो gzip संपीड़न कुछ भी अधिक से ज्यादा मददगार होगा।
आपके मूल प्रश्न के लिए, ऐसा करने के कई तरीके । आप एक्सपीएटीएच (जैसे एचटीएमएल वैध एक्सएचटीएमएल) की तरह कुछ के साथ भी समस्या पर हमला कर सकते हैं और फिर रीगेक्स के साथ जोड़ सकते हैं। लेकिन मुझे लगा कि मैं यह करने के लिए एक एकल रेगेक्स लिखने में अपने हाथ की कोशिश करूँगा:
(& lt; पूर्व & gt; [^ & lt; & gt;] * (((?? & Lt; ओपन & gt; ;) [^ & lt; & gt;] *) + ((& lt;? बंद ओपन & gt; & gt;) [^ & lt; & gt;] *) +) * ((ओपन) ()) के & lt;?! / पूर्व & gt ;) | [\ N \ r]
ऐसा लगता है सौभाग्य से, एनईटी के पास एक अत्यंत शक्तिशाली रेगेक्स इंजन है जिसमें बहुत ही शांत संतुलित मिलान सुविधा शामिल है। मैं इसे किसी भी व्याख्या नहीं कर सकता लेकिन यह विचार पहले टैग्स की शुरूआत और समाप्ति से मेल खाने के लिए है और सुनिश्चित करें कि सब कुछ अंदर से छूटा गया है। तब उन प्री टैग के आसपास की सभी चीजें लागू होनी चाहिए regex के बाकी, "[\ n \ r]"।
इस काम को करने के लिए आप बस ऐसा करेंगे:
स्रोत = नया रेगेक्स ("(& lt; पूर्व & gt; [^ & lt; & gt;] * ((( ? से & lt; ओपन & gt; & lt;) [^ & lt; & gt;] *) + ((& lt;? बंद ओपन & gt; & gt;) [^ & lt; & gt;]? *) +) * ((ओपन) (?! )) & Lt; / pre & gt;) | [\ n \ r] ", RegexOptions.Compiled | RegexOptions.Singleline। Replace (स्रोत," $ 1 ");
अंत में $ 1 नोट करें यह वह हिस्सा है जो पूर्व टैग के अंदर से परिणामों को पकड़ लेता है और उन्हें अछूता देता है।
उसके बाद एक स्थान को \ s \ s + को बदलने के लिए दूसरी पंक्ति लिखने के बाद मैं लगता है कि को बहुत अच्छी तरह से काम करना चाहिए।
Comments
Post a Comment