动态设置工作表名称时出现以下错误。有没有人有设置它之前验证名称的正则表达式?验证excel工作表名称
- 您键入的名称不超过31个字符。名称确实是
- 不包含以下任何字符::\ /? * [或]
- 您没有将名称留空。
动态设置工作表名称时出现以下错误。有没有人有设置它之前验证名称的正则表达式?验证excel工作表名称
要做到使用正则表达式的指定无效字符表验证,可以使用这样的事情:
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完成的,而是避免过度设计这个问题。
您可以使用该方法来检查工作表名称是有效的
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;
}
谢谢..这将工作,但我更喜欢正则表达式,因为它更干净。 – UshaP 2012-08-05 14:39:09
类似的东西?
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;
}
或者,你当然可以将返回类型切换为bool ... – Jan 2012-08-05 14:45:49
让我们匹配字符串的开头,然后匹配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有正确的方法,可以直接清晰地编码条件。毕竟,我现在满意地回答你问的问题实际上并不是有用的。
你有任何你试过的代码吗?请把它放在这里,以便我们看到发生了什么。 – Sam 2012-08-05 14:29:31
它更像是一个普通的正则表达式问题。如果你尝试做Worksheet ws =(Worksheet)xlApp.ActiveWorkbook.Worksheets [iWS ++]; ws.Name =“aa [x]”;你会得到这个例外 – UshaP 2012-08-05 14:36:04
请看我下面的评论,解释我认为是错误的。 **编辑**对不起,我想我误解了这个问题,所以我删除了下面的评论。 – Sam 2012-08-05 14:54:54