今天在逛百度知道时,遇到一位应该也是开发的提了一个问题,我也就想了一下,记录下来自己的方法。
题目是这样的,定义一个字符串:
String str = "abc121313sfsdfk56456ffffdd";
想实现的效果就是提取出字符串和数字的分组,分组结果就是:abc、121313、sfsdfk、56456、ffffdd。
遍历肯定是必须的,之前想的是遍历每个字符,设置一个临时标志位,和一个临时字符串,用于表示下面的字符是数字或者是字母的时候需要拼接一起,这当然是比较基础的,还有一种方法是利用正则表达式分别匹配出来,接下来就这两种方式,也都写一下。
第一种方法:遍历字符串,临时变量方法,代码如下:
String str = "abc121313sfsdfk56456ffffdd"; List<String> letterList = new ArrayList<>();//存储字母列表 List<String> numberList = new ArrayList<>();//存储数字列表 char[] charArray = str.toCharArray(); StringBuilder strTemp = new StringBuilder(); boolean lastCharNumber = true;//true:数字;false:字母 //主要为了防止没有初始化就开始判断,如果去掉,会导致第一个字母a被忽略 boolean inited = false; for (int i = 0; i < charArray.length; i++) { char charTemp = charArray[i]; boolean tempCharIsNumer = Character.isDigit(charTemp); if (!inited) { inited = true; lastCharNumber = tempCharIsNumer; } if (lastCharNumber == tempCharIsNumer) { strTemp.append(charTemp); } else { if (lastCharNumber) { numberList.add(strTemp.toString()); } else { letterList.add(strTemp.toString()); } strTemp = new StringBuilder(); strTemp.append(charTemp); lastCharNumber = tempCharIsNumer; } //最后一次 if (i == charArray.length - 1) { if (lastCharNumber) { numberList.add(strTemp.toString()); } else { letterList.add(strTemp.toString()); } } } System.out.println(letterList); System.out.println(numberList);
第二种方法:正则表达式,代码如下:
String str = "abc121313sfsdfk56456ffffdd"; List<String> letterList = new ArrayList<>();//存储字母列表 List<String> numberList = new ArrayList<>();//存储数字列表 //数字提取 Pattern numberPattern = Pattern.compile("[0-9]{1,}"); Matcher numberMatcher = numberPattern.matcher(str); while (numberMatcher.find()) { numberList.add(numberMatcher.group()); } //字母提取 Pattern stringPattern = Pattern.compile("[a-zA-Z]{1,}"); Matcher stringMatcher = stringPattern.matcher(str); while (stringMatcher.find()) { letterList.add(stringMatcher.group()); } System.out.println(letterList); System.out.println(numberList);
当然,其他方法肯定也是有的,在这里就展现这两种在脑海中首先想到的,也是比较常见的方法。