You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java中如何高效判断字符串仅含Unicode[0-9]或[٠-٩]?

判断字符串仅含0-9或٠-٩的最高效Java实现

嘿,这个问题我刚好有不少实践经验!要判断一个字符串是不是只包含标准阿拉伯数字(0-9)和阿拉伯-Indic数字(٠-٩),最高效的方式是直接遍历每个字符进行范围判断——比正则表达式的性能高出不少,尤其在处理大量字符串或者长文本的时候。

为什么直接遍历是最优解?

正则表达式虽然写法简洁,但背后需要经历编译、匹配的流程,有额外的框架开销。而直接遍历字符串的每个字符,是纯O(n)的线性操作,没有多余的中间步骤,内存占用也更低。

另外,别用Character.isDigit(c)来判断!这个方法会把很多其他Unicode数字(比如中文数字、罗马数字、泰文数字等)也识别为数字,完全不符合我们只限定两类数字的需求。

具体实现代码

public static boolean isTargetDigitsOnly(String input) {
    // 先处理边界情况:null或空串,可根据业务需求调整返回值
    if (input == null || input.isEmpty()) {
        return false;
    }
    
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        // 检查是否是0-9,或者阿拉伯-Indic数字(Unicode U+0660到U+0669)
        boolean isStandardDigit = (c >= '0' && c <= '9');
        boolean isArabicIndicDigit = (c >= '\u0660' && c <= '\u0669');
        if (!isStandardDigit && !isArabicIndicDigit) {
            return false;
        }
    }
    return true;
}

代码细节说明

  • charAt(i)而非转成char[]:避免复制整个字符数组,节省内存空间。
  • 用Unicode转义符\u0660\u0669:比直接写٠这类字符更稳妥,能避免文件编码不一致导致的字符乱码问题。
  • 提前返回逻辑:一旦遇到不符合的字符立刻返回false,不用遍历完整个字符串,进一步提升效率。

正则表达式的替代方案(简洁但性能稍逊)

如果你的场景对性能要求没那么极致,正则表达式的写法更简洁易读。记得预编译Pattern,避免每次调用都重新编译的额外开销:

// 预编译正则,放在类级别静态变量中复用
private static final Pattern TARGET_DIGITS_PATTERN = Pattern.compile("^[0-9٠-٩]+$");

public static boolean isTargetDigitsOnlyWithRegex(String input) {
    return input != null && TARGET_DIGITS_PATTERN.matcher(input).matches();
}

但要注意,即使预编译了,正则匹配的性能还是不如直接遍历——尤其是在高频调用或者处理很长的字符串时,两者的性能差异会更明显。

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

火山引擎 最新活动