2012-08-05 232 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有正确的方法,可以直接清晰地编码条件。毕竟,我现在满意地回答你问的问题实际上并不是有用的。