C# .Net中如何实现TextBox输入手机号时自动用逗号分隔多个号码
实现思路
- 首先调整正则表达式,覆盖两种合法场景:
- 完整可提交的手机号序列:
^09\d{9}(,09\d{9})*$可匹配任意个用英文逗号分隔的合规手机号 - 输入中的中间状态:
^09\d{0,9}(,09\d{0,9})*$兼容还未输完11位的输入过程,避免实时校验时误判非法
- 完整可提交的手机号序列:
- TextChanged事件处理要兼顾三个核心体验点:
- 自动过滤非法字符,仅允许输入数字和英文逗号
- 单个手机号输满11位后自动追加英文逗号,无需用户手动输入
- 修改文本后保留光标位置,不会打断用户正常输入节奏
完整实现代码
private void phone_number_TextChanged(object sender, EventArgs e) { // 记录当前光标位置,避免修改文本后光标跳转到开头 int cursorPosition = phone_number.SelectionStart; string originalText = phone_number.Text; // 第一步:过滤非法字符,仅保留数字和英文逗号 string filteredText = new string(originalText.Where(c => char.IsDigit(c) || c == ',').ToArray()); // 第二步:校验输入格式是否符合规则(兼容输入中间态) string inputPattern = @"^09\d{0,9}(,09\d{0,9})*$"; if (!System.Text.RegularExpressions.Regex.IsMatch(filteredText, inputPattern)) { // 输入非法时回退到上一次的合法文本 phone_number.Text = _lastValidText; phone_number.SelectionStart = Math.Max(cursorPosition - 1, 0); return; } // 第三步:自动添加英文逗号逻辑 string[] segments = filteredText.Split(','); for (int i = 0; i < segments.Length; i++) { // 最后一个手机号段刚好输满11位、且末尾还没有逗号时自动追加 if (segments[i].Length == 11 && i == segments.Length - 1 && !filteredText.EndsWith(",")) { filteredText += ","; // 追加逗号后光标位置同步后移一位 cursorPosition++; break; } } // 第四步:更新文本并记录当前合法状态 _lastValidText = filteredText; phone_number.Text = filteredText; phone_number.SelectionStart = cursorPosition; } // 类成员变量,存储上一次的合法输入,用于非法输入回退 private string _lastValidText = string.Empty;
补充说明
如果最终提交时需要校验整个序列完全合规(没有未完成的手机号段),可以使用全量匹配正则^09\d{9}(,09\d{9})*,?$做校验,末尾的多余逗号可以用TrimEnd(',')统一清理后再提交。
内容的提问来源于stack exchange,提问作者user14352137
相关产品推荐
相关产品推荐

