ワークシート名を動的に設定すると、以下のエラーが発生します。名前を設定する前に名前を検証するための正規表現を持っている人はいますか?
- 入力する名前は 31 文字以内です。名前は
- 次の文字を含まない: : \ / ? * [ また ]
- 名前を空白のままにしませんでした。
このメソッドを使用して、シート名が有効かどうかを確認できます
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;
}
文字列の先頭、禁止リストにない 1 ~ 31 個の要素、文字列の末尾を照合します。少なくとも 1 つの手段を要求することは、空の文字列を拒否することを意味します。
^[^\/\\\?\*\[\]]{1,31}$
この正規表現が見逃すニュアンスが少なくとも 1 つあります。これは一連のスペース、タブ、および改行を受け入れます。これは、空白と見なされると問題になります (おそらくそうです)。
正規表現から長さチェックを外すと、次のようにして空白チェックを取得できます。
^[^\/\\\?\*\[\]]*[^ \t\/\\\?\*\[\]][^\/\\\?\*\[\]]*$
それはどのように機能しますか?上記のクラスを WORKSHEET として定義すると、次のようになります。
^[^WORKSHEET]*[^\sWORKSHEET][^WORKSHEET]*$
したがって、1 つ以上の禁止されていない文字、次に禁止されておらず空白でもない文字、0 個以上の禁止されていない文字に一致します。重要なのは、中間セクションに少なくとも 1 つの非空白文字を要求することです。
しかし、長さのチェックを失いました。長さチェックと正規表現の両方を 1 つの式で行うのは困難です。カウントするには、一致する時間の観点から物事を表現する必要があり、一致n
するものの長さが 1 であることがわかっている必要があります。必ずしも長さが 1 ではない一致の一部が必要です。
まあ、それは完全に真実ではありません。この時点で、これは非常に悪い考えになり始めますが、それでもなお、違反へと進みます! (教育目的のみ)
空白の可能性のあるセクションを使用する代わりに*
、それぞれに期待される数を指定し、これら 3 つのセクションを合計して 31 になるすべての可能な方法を含めることができます.2 つの数値を合計して 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 は条件を直接かつ明確にエンコードする正しいアプローチをしていると思います。結局のところ、あなたの質問に対する回答が実際には役に立たないことに満足しています。
正規表現を使用して指定された無効な文字のワークシート検証を行うには、次のようなものを使用できます。
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 か空か、または 31 より大きいかどうかを確認するためのチェックも含まれます。これら 2 つのチェックは、単純にするためと、この問題を過度にエンジニアリングすることを避けるために、正規表現を介して行われません。