validationexcel工作表名称

dynamic设置工作表名称时出现以下错误。 有没有人有正则expression式在设置之前validation名称?

  • 您键入的名称不超过31个字符。 名字呢
  • 不包含以下任何字符::\ /? * [ 要么 ]
  • 你没有留下空白的名字。

要使用正则expression式对那些指定的无效字符进行工作表validation,可以使用如下所示:

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; 

这还包括检查工作表名称是否为空或空,或者是否大于31.这两个检查不是通过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; } 

让我们匹配string的开始,然后匹配1到31个不在禁止列表中的事物,然后匹配string的末尾。 至less要求我们拒绝空string:

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

这个正则expression式会遗漏至less一个细微差别:这将接受一系列的空格,制表符和换行符,如果它被认为是空白的(这可能是),这将是一个问题。

如果从正则expression式中检查长度,那么可以通过执行如下操作来获得空白检查:

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

这是如何运作的? 如果我们将上面的类定义为WORKSHEET,那将是:

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

所以我们匹配一个或多个非禁止的字符,然后匹配既不被禁止也不是空白的字符,然后匹配零个或多个非禁止的字符。 关键是我们要求在中间部分至less有一个非空白字符。

但我们已经失去了长度检查。 在一个expression式中做长度检查和正则expression式是很困难的。 为了计数,我们必须用n次匹配来表示事物,而匹配的事物必须被知道长度为1.但是为了允许空白被自由放置 – 只要它不是全部空白 – 我们需要有一个长度不一定为1的部分。

那么,这不是真的。 在这一点上,这开始变成一个非常糟糕的主意,但是:从开始就进入了突破口! (仅用于教育目的)

我们可以指定我们期望的每个数字,而不是将*用于可能为空的部分,并且包括这三个部分加起来的所有可能方式。对于两个数字加起来有多less种方法? 那么,有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}$ 

显然,如果这是一个好主意,你会写一个expression式的程序,而不是手工指定(并且弄错了)。 但我不认为我需要告诉你这不是一个好主意。 不过,这是我对你的问题唯一的答案。

虽然不是真的回答你的问题,我认为@HatSoft有正确的方法,直接和清晰地编码条件。 毕竟,我现在满意的回答你提出的问题实际上并不是一件有用的事情。

类似的东西?

  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; }