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

Java正则表达式优化求助:筛选仅含1、2、3数字的数组元素

问题分析与解决方案

首先,你的问题出在正则表达式的逻辑上——原正则没有正确限制整个数字只能由1、2、3组成,导致不符合要求的数字被误保留了。

原正则的问题

你写的正则(0|[a-zA-Z4-9].*)的逻辑是匹配两种情况:

  • 单个字符0
  • 以字母或4-9开头,后面跟任意内容

当你用!matches(...)取反时,会保留所有不匹配这两种情况的字符串。比如:

  • "10":第一个字符是1(不在字母/4-9里),也不是单个0,所以不匹配正则,取反后为true,被保留
  • "145":第一个字符是1,同样不匹配正则,取反后为true,被保留

这就是为什么你的输出里会出现10、145这些不符合要求的数字。

正确的正则表达式

我们需要的是整个字符串只能由1、2、3这三个数字组成,对应的正则是:

^[123]+$
  • ^:匹配字符串的开头
  • [123]:匹配1、2、3中的任意一个字符
  • +:表示前面的字符至少出现一次(避免空字符串,同时排除单个0的情况)
  • $:匹配字符串的结尾

这个正则会严格检查:从字符串的第一个字符到最后一个字符,只能是1、2、3中的数字,没有其他字符。

修改后的代码

把findNumbers方法里的filter部分替换成这个正则即可:

private List<Integer> findNumbers(int[] is) {
    List<Integer> list = new ArrayList<>();
    Arrays.stream(is)
          .filter(data -> String.valueOf(data).matches("^[123]+$"))
          .sorted()
          .forEach(list::add);
    return list;
}

测试一下你的输入数组{22,123,456,145,5,3,000,10,453}:

  • 符合条件的数字:3、22、123,排序后输出就是你期望的结果。

另外注意:Java里的000是八进制数,实际值为0,转字符串是"0",会被这个正则过滤,符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:01