Java正则表达式Matcher或运算时无法提取连续两位数字问题
解决正则提取所有连续数字的问题
你的代码存在几个关键问题,导致无法正确提取所有连续数字:
- 原正则表达式
.*(\d{4})|(\d{3})|(\d{2})|(\d+).*逻辑错误:.*是贪婪匹配,会优先吃掉字符串中大部分内容,且分支结构是让整个字符串匹配其中一种模式,而非查找所有数字序列;分组的设计也只能捕获某一种长度的数字,无法收集所有结果。 - 仅调用一次
matcher.find(),只能获取第一个匹配项,没法提取所有符合条件的数字序列。
正确实现方式
要提取字符串中所有连续数字(包括单个数字),只需用\d+作为正则表达式,循环调用find()方法收集所有匹配结果即可:
public static void main(String args[]) { print(checkRegex("2G18R")); } private static void print(String arr[]) { for(String s : arr) { System.out.println(s); } System.out.println("-----------------------------"); } private static String[] checkRegex(String str) { System.out.println("original string " + str); Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(str); List<String> resultList = new ArrayList<>(); while (matcher.find()) { resultList.add(matcher.group()); } return resultList.toArray(new String[0]); }
代码说明
\d+:匹配1个或多个连续数字,天然覆盖单个数字和多位数的情况,不需要分长度写多个分支。while (matcher.find()):循环查找所有匹配的数字序列,每次找到后将结果加入列表。- 最后将列表转为字符串数组返回,运行后会输出你期望的
2和18。
内容的提问来源于stack exchange,提问作者Amit Dube
相关产品推荐
相关产品推荐

