java - 如果子字符串可以转换为int,如何拆分分隔的字符串
问题描述
我试图将一个字符串拆分为一个字符串列表,该列表以字符是否可以数字转换为分隔符。换句话说,我想把我的字符串分成不同的数字和字母组。为了增加乐趣,我还尝试从每组数字中删除任何前导 0。考虑以下示例。
假设你被"aoeu01234stnh0987"
作为你的输入。我想要的输出是["aoeu", "1234", "stnh", "987"]
我在下面做了一个工作示例,但它有点长且令人困惑。似乎必须有一种更好、更简洁的方法来实现这一点。
private static List<String> fragmentString(String string) {
char[] charArr = string.toCharArray();
StringBuilder tempStr = new StringBuilder();
StringBuilder tempInt = new StringBuilder();
List<String> tempList = new ArrayList<>();
boolean wasPrevNum = false;
for (char c : charArr) {
boolean isNum = Character.isDigit(c);
if (isNum) {
tempInt.append(c);
if (!wasPrevNum) {
wasPrevNum = true;
tempList.add(tempStr.toString());
tempStr = new StringBuilder();
}
} else {
tempStr.append(c);
if(wasPrevNum) {
while (tempInt.charAt(0) == '0') tempInt.deleteCharAt(0);
tempList.add(tempInt.toString());
tempInt = new StringBuilder();
wasPrevNum = false;
}
}
}
if (tempInt.length() > 0) while (tempInt.charAt(0) == '0') tempInt.deleteCharAt(0);
tempList.add(wasPrevNum ? tempInt.toString() : tempStr.toString());
return tempList;
}
我看到了这篇关于使用该split()
方法的帖子,但该解决方案仅适用于他们非常具体的情况,不适用于此处。该split()
方法是我解决这个问题的第一件事,但我无法弄清楚一个正则表达式,现在我质疑这是否可能使用split()
.
解决方案
一个非常简单的解决方案是使用正则表达式。正则表达式,\p{L}+|[0-9]+
表示字母序列或数字序列,可用于查找子字符串。然后,尝试解析找到的子字符串。如果它是一个整数,前导零将作为解析的结果被删除,如果解析失败,只需打印子字符串。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main {
public static void main(String[] args) {
String str = "aoeu01234stnh0987";
Matcher matcher = Pattern.compile("\\p{L}+|[0-9]+").matcher(str);
while (matcher.find()) {
String substring = matcher.group();
try {
System.out.println(Integer.parseInt(substring));
} catch (NumberFormatException e) {
System.out.println(substring);
}
}
}
}
输出:
aoeu
1234
stnh
987