今天在逛百度知道时,遇到一位应该也是开发的提了一个问题,我也就想了一下,记录下来自己的方法。
题目是这样的,定义一个字符串:
String str = "abc121313sfsdfk56456ffffdd";
想实现的效果就是提取出字符串和数字的分组,分组结果就是:abc、121313、sfsdfk、56456、ffffdd。
遍历肯定是必须的,之前想的是遍历每个字符,设置一个临时标志位,和一个临时字符串,用于表示下面的字符是数字或者是字母的时候需要拼接一起,这当然是比较基础的,还有一种方法是利用正则表达式分别匹配出来,接下来就这两种方式,也都写一下。
第一种方法:遍历字符串,临时变量方法,代码如下:
String str = "abc121313sfsdfk56456ffffdd";
List letterList = new ArrayList<>();//存储字母列表
List 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 letterList = new ArrayList<>();//存储字母列表
List 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);
当然,其他方法肯定也是有的,在这里就展现这两种在脑海中首先想到的,也是比较常见的方法。