|
> -1000〜1000で小数は小数点第2位までってことです。
・テストは不十分です。
・十分吟味した正規表現ではないので、整理すればもっとコンパクトで
わかりやすいものになる・・・かもしません。
・小数第三位以降に入力がある場合もマッチしないようにしています。
正規表現は得意ではないので、もっとコンパクトに書く方法もあるかもしれませんが、
私ならこんな正規表現は使いたくないです。
正規表現で扱うのはチェックしたい内容の一部にしますね。
少なくとも数値範囲のチェックは別にやるようにして、-0や002などは自動で0や2に変換する
ような方法を取ると思います。
private void TestAll()
{
string s =
@"^(-?(1000(\.0{1,2})?|[1-9][0-9]{0,2}(\.[0-9]{1,2})?|0\.([1-9][0-9]|[0-9][1-9]))|0(\.0{1,2})?)$";
Regex r = new Regex(s);
object[,] tests = new object[,]{
{"1000.00", true},
{"1000.01", false},
{"1000.000", false},
{"-1000.00", true},
{"-1000.01", false},
{"-1000.000", false},
{"0", true},
{"0.0", true},
{"-0", false},
{"-0.0", false},
{"009", false},
{"1001", false}
};
for (int i = 0; i < tests.GetUpperBound(0); i++)
{
Debug.WriteLine(
String.Format(
"テストする値:{0} 想定される結果:{1} → テスト結果:{2}",
tests[i, 0],
(bool)tests[i, 1] ? "マッチする" : "マッチしない",
Test(r, (string)tests[i, 0], (bool)tests[i, 1]) ? "OK" : "NG"
)
);
}
}
private bool Test(Regex r, string input, bool ans)
{
return (r.IsMatch(input) == ans);
}
|