Flutter 用户电话号码 中间显示*

发布于:2025-03-23 ⋅ 阅读:(25) ⋅ 点赞:(0)
String maskPhoneNumber(String phoneNumber) {
  if (phoneNumber.length < 11) {
    return phoneNumber;
  }
  return phoneNumber.substring(0, 3) + '****' + phoneNumber.substring(7);
}

void main() {
  String phone = '13800138000';
  print(maskPhoneNumber(phone));
}    
使用正则表达式
import 'dart:regexp';

String maskPhoneNumberWithRegex(String phoneNumber) {
  // 使用正则表达式匹配电话号码中间四位数字
  return phoneNumber.replaceAllMapped(RegExp(r'(\d{3})\d{4}(\d{4})'), (match) {
    // 将匹配到的中间四位数字替换为 ****
    return '${match.group(1)}****${match.group(2)}';
  });
}

void main() {
  String phone = '13800138000';
  print(maskPhoneNumberWithRegex(phone));
}
  • \d:这是一个元字符,代表任意一个数字字符,等同于 [0-9]。
  • {n}:这是一个量词,表示前面的元素必须恰好出现 n 次。
  • ():这是捕获组,用于把正则表达式的一部分括起来,这样就能把匹配到的内容提取出来。

详细点

  • (\d{3}):此为第一个捕获组,它会匹配任意连续的三个数字字符。在电话号码的情境下,这通常代表电话号码的前三位(例如手机号码的号段)。
  • \d{4}:这会匹配任意连续的四个数字字符,对应电话号码中间需要被掩码处理的四位数字。
  • (\d{4}):这是第二个捕获组,会匹配任意连续的四个数字字符,对应电话号码的后四位。

replaceAllMapped 方法会对字符串中所有匹配正则表达式的部分进行替换。它接收两个参数,第一个是正则表达式对象,第二个是一个回调函数。

match.group(1):会返回第一个捕获组匹配到的内容,也就是电话号码的前三位。
match.group(2):会返回第二个捕获组匹配到的内容,也就是电话号码的后四位。

使用字符串替换
String maskPhoneNumberWithCharReplace(String phoneNumber) {
  if (phoneNumber.length < 11) {
    return phoneNumber;
  }
  StringBuffer maskedNumber = StringBuffer();
  for (int i = 0; i < phoneNumber.length; i++) {
    if (i >= 3 && i < 7) {
      maskedNumber.write('*');
    } else {
      maskedNumber.write(phoneNumber[i]);
    }
  }
  return maskedNumber.toString();
}

void main() {
  String phone = '13800138000';
  print(maskPhoneNumberWithCharReplace(phone));
}