Regex r = new Regex(@"^[0-9\-]"); // ❌ 只匹配開頭第一個字符
if (r.IsMatch(val.ToString())) { ... } // ❌ 邏輯反了:匹配上才報錯
// ^ 開頭 $ 結尾 [\d-]+ 一個或多個數字或連字符
Regex r = new Regex(@"^[\d-]+$");
bool IsNotNumberOrHyphen(object val) {
if (!SYUtil.IsValid(val) || string.IsNullOrEmpty(val.ToString()))
return false;
// 整串只能包含數字和連字符
Regex r = new Regex(@"^[\d-]+$");
if (!r.IsMatch(val.ToString())) { // ❌ 不匹配才報錯
MessageBox.Show("只能輸入數字及 [-]");
return true; // 返回 true 表示驗證失敗
}
return false; // 驗證通過
}
| 符號 | 含義 |
|---|---|
| ^ | 字符串開頭 |
| $ | 字符串結尾 |
| \d | 數字 [0-9] |
| - | 連字符 (在 [] 開頭/結尾不需轉義) |
| [\d-] | 字符集:數字或連字符 |
| + | 量詞:1 次或多次 |
| ^[\d-]+$ | 整串只由數字/連字符組成,至少一個字符 |
var tests = new[] {
"123", "12-34", "-123", "12-", "-", // ✅ 合法
"12a3", "12.3", "12 3", "", "abc" // ❌ 非法
};
foreach (var t in tests) {
Console.WriteLine($"{t,-6} => {Regex.IsMatch(t, @"^[\d-]+$")}");
}
// -?\d+ 或 -?\d+(-\d+)* (如 123, -123, 12-34-56)
Regex r = new Regex(@"^-?\d+(-\d+)*$");
正則核心:`^[\d-]+$` 簡潔解決「只能輸入數字和連字符」需求。