Regex校验车牌格式异常:所有车牌均标为橙色如何修复?
问题修复:车牌校验正则始终返回false的解决办法
核心问题分析
你的代码中PlakaFormat函数始终返回false,主要有以下几个关键原因:
- 大小写限制:正则里的
[A-Z]仅匹配大写字母,但实际输入的车牌可能包含小写字母,导致匹配失败。 - 前后空白干扰:如果车牌字符串前后存在多余空格,正则的
^(开头)和$(结尾)会严格限制匹配范围,直接导致不匹配。 - 空白字符类型不兼容:实际输入可能是全角空格(中文输入法下的空格),而正则里的
\s默认只匹配半角空格,无法识别全角空格。
具体修复步骤
1. 预处理输入字符串
在获取车牌字符串时,先去除前后空白,同时把全角空格替换为半角空格,统一输入格式:
string plaka = rows.Cells[0].Value?.ToString()?.Trim().Replace('\u00A0', ' ');
2. 修改正则匹配规则
给正则匹配添加忽略大小写的选项,确保大小写字母都能被正确识别:
修改PlakaFormat函数里的匹配逻辑:
if (Regex.IsMatch(plaka, format, RegexOptions.IgnoreCase))
3. 恢复合规车牌的默认样式
原代码中仅标记不合规的车牌,但未恢复合规车牌的背景色,会导致之前的标记残留,需要补充对应逻辑:
else { rows.Cells[0].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor; }
4. 调试验证(可选)
可以添加调试输出,查看实际待校验的车牌内容,快速定位格式问题:
Console.WriteLine($"当前校验车牌:{plaka}");
修改后的完整代码示例
static bool PlakaFormat(string plaka) { string[] formatlar = { @"^\d{2}\s[A-Z]\s\d{4}$", @"^\d{2}\s[A-Z]\s\d{5}$", @"^\d{2}\s[A-Z]{2}\s\d{3}$", @"^\d{2}\s[A-Z]{2}\s\d{4}$", @"^\d{2}\s[A-Z]{3}\s\d{2}$", @"^\d{2}\s[A-Z]{3}\s\d{3}$" }; foreach (var format in formatlar) { // 添加忽略大小写选项,兼容小写字母输入 if (Regex.IsMatch(plaka, format, RegexOptions.IgnoreCase)) { return true; } } return false; } private void btn_kontrol_Click(object sender, EventArgs e) { foreach (DataGridViewRow rows in dataGridView1.Rows) { // 预处理输入:去除前后空白、替换全角空格为半角 string plaka = rows.Cells[0].Value?.ToString()?.Trim().Replace('\u00A0', ' '); if (!string.IsNullOrEmpty(plaka)) { if (!PlakaFormat(plaka)) { rows.Cells[0].Style.BackColor = Color.Orange; } else { // 合规车牌恢复默认背景色,避免标记残留 rows.Cells[0].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor; } } else { rows.Cells[0].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor; } } }
内容的提问来源于stack exchange,提问作者Furkan Sefa TUNÇ
相关产品推荐
相关产品推荐

