You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何用正则表达式验证Unicode阿拉伯数字?

解决Flutter中Unicode阿拉伯数字的正则验证问题

问题分析

你当前的正则仅匹配ASCII数字(0-9),无法识别两类Unicode阿拉伯数字:东方阿拉伯数字(如١、٠١٢٣٤٥٦٧٨٩,对应U+0660-0669)和波斯/乌尔都数字(如۱、۰۱۲۳۴۵۶۷۸۹,对应U+06F0-06F9)。直接用\u06f1无效,大概率是因为实际输入的是另一组Unicode阿拉伯数字。

两种可行解决方案

方案1:转换Unicode数字为ASCII后验证

这种方式无需修改原有正则逻辑,先将输入中的所有Unicode十进制数字转换为ASCII数字,再用你原来的正则验证,兼容性最好:

  1. 编写转换函数:
String convertToAsciiDigits(String input) {
  return input.replaceAllMapped(RegExp(r"[\u0660-\u0669\u06F0-\u06F9]"), (match) {
    final charCode = match.group(0)!.codeUnitAt(0);
    // 处理东方阿拉伯数字(U+0660-0669)
    if (charCode >= 0x0660 && charCode <= 0x0669) {
      return String.fromCharCode(charCode - 0x0660 + 0x30);
    }
    // 处理波斯/乌尔都数字(U+06F0-06F9)
    else if (charCode >= 0x06F0 && charCode <= 0x06F9) {
      return String.fromCharCode(charCode - 0x06F0 + 0x30);
    }
    return match.group(0)!;
  });
}
  1. 修改验证逻辑:
TextFormField(
  // 你的其他属性(如formKey等)
  validator: (String? val) {
    if (val == null) return "Not Valid";
    // 转换为ASCII数字后验证
    final asciiVal = convertToAsciiDigits(val);
    if (RegExp(r"(09)(1[0-9]|3[0-9]|2[0-2])([0-9]{7})").hasMatch(asciiVal)) {
      return null;
    }
    return "Not Valid";
  },
)

方案2:修改正则直接匹配Unicode数字

如果你不想做转换,可直接扩展正则,同时覆盖ASCII、东方阿拉伯、波斯数字的范围:

TextFormField(
  // 你的其他属性(如formKey等)
  validator: (String? val) {
    if (val != null && RegExp(r"(09|٠٩|۰۹)([13١٣۱۳][0-9\u0660-\u0669\u06F0-\u06F9]|2[0-2]|٢[٠-٢]|۲[۰-۲])([0-9\u0660-\u0669\u06F0-\u06F9]{7})").hasMatch(val)) {
      return null;
    }
    return "Not Valid";
  },
)
  • 正则说明:09|٠٩|۰۹匹配开头的ASCII/Unicode版本"09";[13١٣۱۳]匹配ASCII和Unicode的1、3;[0-9\u0660-\u0669\u06F0-\u06F9]匹配所有十进制数字;2[0-2]|٢[٠-٢]|۲[۰-۲]匹配ASCII和Unicode的20-22区间。

补充说明

如果想匹配所有Unicode十进制数字,也可以使用Unicode属性类(需开启unicode参数),比如RegExp(r"\p{Nd}", unicode: true),但结合你的特定格式验证,方案1的转换方式更直观、不易出错。

内容的提问来源于stack exchange,提问作者Zahra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:13:29