2013-07-09 16 views
5

मैं एक स्ट्रिंग 'क्लीन-अप' फ़ंक्शन लिखने की कोशिश कर रहा हूं जो केवल अल्फान्यूमेरिक वर्णों, साथ ही कुछ अन्य, जैसे अंडरस्कोर, अवधि और माइनस (डैश) वर्ण की अनुमति देता है।क्या आप अंडरस्कोर के साथ अवांछित वर्णों को प्रतिस्थापित करने के लिए RegEx बना सकते हैं?

वर्तमान में हमारा फ़ंक्शन स्रोत स्ट्रिंग के सीधे चार पुनरावृत्ति का उपयोग करता है, लेकिन मैं इसे रीजएक्स में रूपांतरित करने की कोशिश कर रहा हूं क्योंकि जो मैंने पढ़ा है, वह बहुत साफ और अधिक प्रदर्शनकारी है (जो मुझे पीछे की ओर लगता है सीधे पुनरावृत्ति, लेकिन जब तक मैं एक कामकाजी RegEx प्राप्त नहीं करता तब तक मैं इसे प्रोफ़ाइल नहीं कर सकता।)

समस्या मेरे लिए दो गुना है। एक, मैं जानता हूँ कि निम्नलिखित regex ...

[a-zA-Z0-9] 

... अक्षरांकीय वर्णों की एक सीमा से मेल खाता है, लेकिन कैसे मैं भी अंडरस्कोर, अवधि और तापमान शून्य से चरित्र में शामिल हैं? क्या आप उन्हें '\' चरित्र से बचते हैं और उन्हें बाकी के साथ ब्रैकेट के बीच रखते हैं?

दूसरा, किसी भी चरित्र के लिए जो मैच का हिस्सा नहीं है (यानी अन्य विराम चिह्न जैसे '?') हम इसे अंडरस्कोर से बदलना चाहते हैं।

मेरी सोच वांछित पात्रों की एक श्रृंखला पर मेल खाना है, हम एक ऐसे चरित्र पर मेल खाते हैं जो वांछित सीमा में नहीं है, फिर उसे प्रतिस्थापित करें। मुझे लगता है कि के लिए रेगुलर एक्सप्रेशन से इस तरह कोष्ठक के बीच पहली चरित्र के रूप में कैरेट शामिल करने के लिए है ...

[^a-zA-Z0-9] 

कि सही दृष्टिकोण है?

+0

Regex.Replace() विधि क्या आप – terrybozzio

+0

जरूरत है मैं लगा कि, लेकिन कृपया देखें मेरा प्रश्न, या इससे संबंधित दो प्रश्न। – MarqueIV

+1

आप अपनी चरित्र कक्षा को बदलना चाहते हैं। अर्थात। '[^ a-zA-Z0-9] ', जो _not_ अल्फान्यूमेरिक है जो सब कुछ मेल खाएगा। –

उत्तर

5

शायद ऐसा करने का सबसे प्रभावी तरीका एक स्थिर रेगेक्स स्थापित करना है जो उन वर्णों का वर्णन करता है जिन्हें आप प्रतिस्थापित करना चाहते हैं।

public static class StringCleaner 
{  
    public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-]", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

    public static string ReplaceInvalidChars(string input) 
    { 
     return invalidChars.Replace(input, "_"); 
    } 
} 

हालांकि, अगर आप Regex लाइन को बदलने के लिए नहीं करना चाहती समाप्त हो जाती है और रिक्त स्थान को (रिक्त स्थानों और टैब की तरह) आप थोड़ा अलग अभिव्यक्ति का उपयोग करना होगा।केवल यदि ऐसा लगता है

एक सेट वर्ग कोष्ठक से दर्शाया जाने के अंदर आप इन पात्रों -#]\ कहीं भी वे होते हैं और ^ पलायन करना होगा:

public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-\s]", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

इसके अलावा, आप निम्न की शाब्दिक वर्ण मैच के लिए पलायन करना होगा के लिए नियम हैं शाब्दिक पात्रों से मेल खाने के लिए सेट की पहली स्थिति में। एक सेट के बाहर आपको इन वर्णों से बच जाना चाहिए: .$^|{}[]()+?# शाब्दिक चरित्र से मेल खाने के लिए।

अधिक जानकारी के लिए निम्न दस्तावेज़ देखें:

+0

दरअसल, मैं इसे * चाहता हूं सभी व्हाइटस्पेस और लाइन एंडिंग्स (और लाइन की शुरुआत!) को प्रतिस्थापित करें। वे मान्य वर्ण नहीं हैं, इसलिए आपका पहला सही है। हालांकि, अगर मैं गलत हूं तो मुझे सही करें, लेकिन आप 'शाब्दिक तार' को '@' चरित्र से शुरू कर रहे हैं , जो मुझे उद्देश्य सी की तरह दिखता है, सी # नहीं ... या क्या मुझे कुछ याद आ रहा है? – MarqueIV

+0

मुझे कुछ याद आ रहा है! :) अब मुझे पता है कि सी # में एक स्ट्रिंग शुरू करने से मूल रूप से आपके लिए पूरी स्ट्रिंग से बच निकलती है। मुझें यह पसंद है! आपको अपनी पूर्णता के लिए स्वीकार्य उत्तर मिलता है। धन्यवाद! :) – MarqueIV

+1

हां, सी # में सी # के साथ एक स्ट्रिंग शुरू करना इसे शाब्दिक बनाता है। यहां भाषा की कल्पना का हिस्सा है जो इसे समझाता है: http://msdn.microsoft.com/en-us/library/aa691090(v=VS। 71) .aspx – JamieSee

3

आप वर्ण है कि आप नहीं चाहते हटाने की कोशिश कर रहे हैं, तो आप बेहतर Regex.Replace द्वारा प्रस्तुत की जा चाहते हैं:

string cleaned = Regex.Replace(input, "[^a-zA-Z0-9_.]|-", "_"); 

शामिल करने के लिए '-' वर्ण तुम सिर्फ regex का उपयोग कर सकते हैं या शामिल करने के लिए वह चरित्र, हालांकि चरित्र वर्ग में इसे शामिल करने का शायद एक तरीका है, यह इस समय मुझे बच रहा है।

संपादित करें: आपको वास्तव में हाइफ़न को स्पष्ट रूप से शामिल करने की आवश्यकता नहीं है, क्योंकि यह कक्षा से मेल नहीं खाता है। यही है, अगर आप अंडरस्कोर के साथ हाइफ़न को प्रतिस्थापित करना चाहते हैं, तो बस अपनी कक्षा के रूप में [^a-zA-Z0-9_.] का उपयोग करें ... जो भी कक्षाएं उन वर्गों से मेल नहीं खाती हैं उन्हें बदल दिया जाएगा। लेकिन कक्षा में एक हाइफ़न शामिल करने का सही तरीका बैकस्लैश (\-) से बचाना है या आप इसे कक्षा सूची की भीख मांग सकते हैं: [^-a-zA-Z0-9_.]

0

मुझे लगता है कि यह स्ट्रिंग के प्रतिस्थापन विधि का उपयोग करने के लिए सही होगा।

public string StringClean(string source, char replacement, char[] targets) 
{ 
    foreach(char c in targets) 
    { 
    //... 
    } 
} 

(नहीं वी.एस. में तो शायद नहीं सही कोड)

+0

यह रेगेक्स कोड नहीं है इसलिए यह पूछे गए प्रश्न पर लागू नहीं है। – MarqueIV

0

आप यह कर सभी वर्णों कि एक अंडरस्कोर से अपने वर्णित तर्ज पर नहीं कर रहे हैं बदलने के लिए की जरूरत है:

string result = Regex.Replace(YourOriginalString, "[^a-zA-Z0-9_.-]", "_"); 
+0

क्या आपको अंत में उस हाइफ़न से बचने की ज़रूरत नहीं है (या क्या यह पूरी तरह से बच निकला है क्योंकि यह अंत में * है? – MarqueIV

+0

इसके निहित, केवल मामले में और यह काम करने की कोशिश की। – terrybozzio

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