我有一个字符串,其中包含一个连续的数字块,然后是一个连续的字符块。我需要将它们分成两部分(一个整数部分和一个字符串)。
我尝试使用String.split("\\D", 1)
,但它正在吞噬第一个角色。
我检查了所有的String API,但没找到合适的方法。
有没有办法做这件事?
答案 0 :(得分:13)
使用外观:str.split("(?<=\\d)(?=\\D)")
String[] parts = "123XYZ".split("(?<=\\d)(?=\\D)");
System.out.println(parts[0] + "-" + parts[1]);
// prints "123-XYZ"
\d
是数字的字符类; \D
是否定的。因此,此零匹配断言与前一个字符为数字(?<=\d)
的位置匹配,后续字符为非数字(?=\D)
。
以下也有效:
String[] parts = "123XYZ".split("(?=\\D)", 2);
System.out.println(parts[0] + "-" + parts[1]);
这在我们看到非数字之前就分裂了。这更接近你的原始解决方案,除了因为它实际上不匹配非数字字符,它不会“吃掉它”。此外,它使用limit
2
,这正是你想要的。
String.split(String regex, int limit)
n
大于零,那么模式将最多应用n - 1
次,数组的长度不会超过n
,并且数组的最后一个条目将包含超出最后匹配分隔符的所有输入。答案 1 :(得分:3)
总有一种老式的方式:
private String[] split(String in) {
int indexOfFirstChar = 0;
for (char c : in.toCharArray()) {
if (Character.isDigit(c)) {
indexOfFirstChar++;
} else {
break;
}
}
return new String[]{in.substring(0,indexOfFirstChar), in.substring(indexOfFirstChar)};
}
(希望它适用于仅限数字或仅限字符串的字符串 - 无法在此处测试 - 如果没有,请将其视为一般概念)