2012-08-05 135 views
1

動態設置工作表名稱時出現以下錯誤。有沒有人有設置它之前驗證名稱的正則表達式?驗證excel工作表名稱

  • 您鍵入的名稱不超過31個字符。名稱確實是
  • 不包含以下任何字符::\ /? * [或]
  • 您沒有將名稱留空。
+0

你有任何你試過的代碼嗎?請把它放在這裏,以便我們看到發生了什麼。 – Sam 2012-08-05 14:29:31

+0

它更像是一個普通的正則表達式問題。如果你嘗試做Worksheet ws =(Worksheet)xlApp.ActiveWorkbook.Worksheets [iWS ++]; ws.Name =「aa [x]」;你會得到這個例外 – UshaP 2012-08-05 14:36:04

+0

請看我下面的評論,解釋我認爲是錯誤的。 **編輯**對不起,我想我誤解了這個問題,所以我刪除了下面的評論。 – Sam 2012-08-05 14:54:54

回答

1

要做到使用正則表達式的指定無效字符表驗證,可以使用這樣的事情:

string wsName = @"worksheetName"; //verbatim string to take special characters literally 
Match m = Regex.Match(wsName, @"[\[/\?\]\*]"); 
bool nameIsValid = (m.Success || (string.IsNullOrEmpty(wsName)) || (wsName.Length > 31)) ? false : true; 

這也包括檢查,看是否工作表的名稱爲null或空,或者如果它是更大爲了簡單起見,這兩項檢查不是通過Regex完成的,而是避免過度設計這個問題。

4

您可以使用該方法來檢查工作表名稱是有效的

private bool IsSheetNameValid(string sheetName) 
{ 
    if (string.IsNullOrEmpty(sheetName)) 
    { 
     return false; 
    } 

    if (sheetName.Length > 31) 
    { 
     return false; 
    } 

    char[] invalidChars = new char[] {':', '\\', '/', '?', '*', '[', ']'}; 
    if (invalidChars.Any(sheetName.Contains)) 
    { 
     return false; 
    } 

    return true; 
} 
+0

謝謝..這將工作,但我更喜歡正則表達式,因爲它更乾淨。 – UshaP 2012-08-05 14:39:09

0

類似的東西?

public string validate(string name) 
    { 
     foreach (char c in Path.GetInvalidFileNameChars()) 
      name = name.Replace(c.ToString(), ""); 

     if (name.Length > 31) 
      name = name.Substring(0, 31); 

     return name; 
    } 
+0

或者,你當然可以將返回類型切換爲bool ... – Jan 2012-08-05 14:45:49

1

讓我們匹配字符串的開頭,然後匹配1到31個不在禁止列表中的事物,然後匹配字符串的末尾。需要至少一個意味着我們拒絕空字符串:

^[^\/\\\?\*\[\]]{1,31}$ 

有至少一個細微之處,這正則表達式將錯過:這將接受的空格,製表符和換行符的序列,如果被認爲這將是一個問題是空白的(因爲它可能是)。

^[^\/\\\?\*\[\]]*[^ \t\/\\\?\*\[\]][^\/\\\?\*\[\]]*$ 

是如何運作的:

如果你把長度退房的正則表達式,那麼你可以做類似拿到空白支票?如果我們定義爲工作表上面我們班,這將是:

^[^WORKSHEET]*[^\sWORKSHEET][^WORKSHEET]*$ 

所以我們匹配一個或多個非禁止的字符,然後一個字符既不禁止也不是空格,最後零個或多個非禁止的字符。關鍵是我們要求中間部分至少有一個非空白字符。

但是我們失去了長度檢查。在一個表達式中很難做長度檢查和正則表達式。爲了計數,我們必須根據匹配n次來描述事物,並且匹配的事物必須被稱爲長度1.但是爲了允許空白被自由放置 - 只要它不是全部空白 - 我們需要有一部分比賽不一定是長度1.

嗯,這不完全正確。在這一點上,這開始變成一個非常糟糕的主意,但是:然後:進入違約! (僅用於教育目的)

而不是使用*爲可能的空白部分,我們可以指定我們期望的數量,幷包括這三個部分加起來的所有可能的方式31.有多少種方式有兩個數字加起來是30嗎?那麼,其中有30個。 0+30, 1+29, 2+28, ... 30+0

^[^WORKSHEET]{0}[^\sWORKSHEET][^WORKSHEET]{30}$ 
|^[^WORKSHEET]{1}[^\sWORKSHEET][^WORKSHEET]{29}$ 
|^[^WORKSHEET]{2}[^\sWORKSHEET][^WORKSHEET]{28}$ 
    .... 
|^[^WORKSHEET]{30}[^\sWORKSHEET][^WORKSHEET]{0}$ 

顯然,如果這是一個好主意,你會寫一個程序,用手工指定的表達,而不是它的所有(和得到的東西是錯誤的)。但我認爲我不需要告訴你這不是一個好主意。然而,這是我對你的問題的唯一答案。

儘管並未真正回答您的問題,但我認爲@HatSoft有正確的方法,可以直接清晰地編碼條件。畢竟,我現在滿意地回答你問的問題實際上並不是有用的。