2010-06-28 16 views
6

मैं RegEx के लिए बहुत नया हूं - तो क्या कोई मुझे यह जानने में मदद कर सकता है कि वास्तव में क्या गलत हो रहा है? - परिमाणक {एक्स, वाई} कुछ भी नहीं त्रुटि निम्नलिखितRegEx - Quantifier {x, y} कुछ भी त्रुटि नहीं

 string regPattern = "*[~#%&*{}/<>?|\"-]+*"; 
     string replacement = ""; 
     Regex regExPattern = new Regex(regPattern); 

फिर भी, जब मेरे ऐप regExPattern लाइन मारता है, मैं एक ArgumentException मिलती है:

मैं इस कोड है।

क्या कोई मदद कर सकता है?

संपादित करें: मैं एक foreach लूप में तो जैसे इस पद्धति पारित करने के लिए की जरूरत है:

if (paths.Contains(regPattern)) 
     { 
      foreach (string files2 in paths) 
      { 
       try 
       { 
        string filenameOnly = Path.GetFileName(files2); 
        string pathOnly = Path.GetDirectoryName(files2); 
        string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
        string sanitized = Path.Combine(pathOnly, sanitizedFileName); 
        //write to streamwriter 
        System.IO.File.Move(files2, sanitized); 

       } 
       catch (Exception ex) 
       { 
        //write to streamwriter 

       } 
      } 
     } 
     else 
     { 
     //write to streamwriter 

     } 

मैं पैटर्न कैसे परिभाषित करते हैं, तो यह इस पाश में पारित कर दिया जा रहा है?

+0

विशिष्ट होने के लिए - कोड में मौजूद पैटर्न का मतलब फ़ाइल नामों में उन अमान्य वर्णों से छुटकारा पाने के लिए है। इसलिए मुझे एक तार, टिल्ड, पाउंड साइन, ब्रैकेट, कोण ब्रैकेट इत्यादि से छुटकारा पाने की आवश्यकता है। क्या यह इसके लिए सही पैटर्न है? – yeahumok

उत्तर

6

अद्यतन: आप चाहते हैं सवाल मुझे लगता है कि करने के लिए टिप्पणी को पढ़ने के बाद बस इस:

s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", ""); 

पुराना जवाब: मुझे लगता है कि जब आप * बारे में आप इस तरह उन आप लिखेंगे के रूप में वाइल्डकार्ड के बारे में सोच रहे हैं एक खोल में:

* .txt

यह नहीं है कि कैसे नियमित अभिव्यक्ति वाक्य रचना में * काम करता है। क्या आप शायद बजाय चाहते .* है:

".*[~#%&*{}/<>?|\"-]+.*" 

. का अर्थ है "किसी भी चरित्र" और * का अर्थ है "पिछले शून्य या के और अधिक"।

चरित्र वर्ग [...] के अंदर * इसका विशेष अर्थ खो देता है और एक शाब्दिक चरित्र बन जाता है इसलिए इसे बचने की आवश्यकता नहीं होती है। इसे चरित्र वर्ग के अंदर अनावश्यक रूप से भागने से कोई नुकसान नहीं होगा और कुछ लोगों को इसे पढ़ने में आसान लगेगा।

+0

* का मतलब तारांकन - कोई चरित्र नहीं है। क्या मुझे अभी भी इसे बैकस्लैश करने की ज़रूरत है? – yeahumok

+0

'*' का अर्थ इस पर निर्भर करता है कि यह एक चरित्र वर्ग के अंदर है या नहीं। एक चरित्र वर्ग के अंदर इसका मतलब शाब्दिक '*' है या नहीं, यह बच निकला है या नहीं। एक चरित्र वर्ग के बाहर इसका अर्थ है "शून्य या अधिक" अगर अनचाहे हो और बच निकला तो शाब्दिक '*'। –

+0

+1 (संशोधन के लिए), और सी # में आपको रेगेक्स के लिए वर्बैटिम स्ट्रिंग का उपयोग करना चाहिए।वे बैकस्लैश का उपयोग बचने वाले चरित्र के रूप में नहीं करते हैं; आपको केवल उद्धरण चिह्न से दूसरे उद्धरण चिह्न से बचना होगा: '@" [~ #% और * {}/<>? | "" -] + "' –

1

* एक क्वांटिफायर है जिसका अर्थ है "शून्य या अधिक बार" ({0,} के समान)। \*

0

आप को बदलने के लिए एक Regex.Replace कर रहे हैं के बाद से इन एक चरित्र के किसी भी एक खाली स्ट्रिंग के साथ मेल खाता है::

 string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]"; 

     string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5"; 

     string output = Regex.Replace(input, pattern, String.Empty); 
0

. जोड़े आप इसे इस तरह एक बैकस्लैश का उपयोग कर से बचने के लिए होगा *

उदाहरण से पहले string regPattern = ".*[~#%&*{}/<>?|\"-]+.*";

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