2010-06-28 18 views
6

我對RegEx非常新穎 - 所以有人可以幫我弄清楚到底什麼地方出了問題?RegEx - 量詞{x,y}沒有任何錯誤

我有這樣的代碼:

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

然而,當我的應用程序打regExPattern線,我得到一個ArgumentException - 量詞{X,Y}以下任何錯誤。

有人可以幫忙嗎?

編輯:我需要這種模式傳遞到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 2010-06-28 19:45:15

回答

6

更新:閱讀,我認爲這個問題的意見後,你想簡單:

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

老回答:我想,當你寫*你所想的通配符如您需要輸入在shell:

* .TXT

這不是*作品正則表達式語法如何。你可能就要什麼是.*

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

.意味着「任何字符」和*手段「零個或多個前面的」。

在字符類裏面[...]*失去了它的特殊含義併成爲一個文字字符,所以它不需要被轉義。在字符類中不必要地轉義它不會造成任何傷害,並且有些人會發現它更易於閱讀。

+0

*表示星號 - 不是任何字符。我還需要反斜槓嗎? – yeahumok 2010-06-28 19:44:20

+0

「*」的含義取決於它是否在字符類中。在字符類內部,它意味着一個文字「*」,不管它是否被轉義。在字符類之外,如果未轉義,則表示「零或多」,如果轉義,則表示「*」。 – 2010-06-28 20:06:20

+0

+1(用於修訂版),並且在C#中,您應該爲正則表達式使用逐字字符串。他們不使用反斜槓作爲轉義字符;您只需用另一個引號將引號轉義:'@「[〜#%&* {}/<>?|」「 - ] +」' – 2010-06-29 07:02:25

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 = ".*[~#%&*{}/<>?|\"-]+.*";