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
相关产品推荐
相关产品推荐

