У меня есть строка, которая содержит непрерывный блок цифр и затем непрерывный блок символов. Я должен разделить их на две части (одна целая часть и одна строка).
Я пытался использовать String.split("\\D", 1)
, но это съедает первый символ. Я проверил всю Строку API и не нашел подходящий метод.
Есть ли какой-либо метод для того, чтобы сделать эту вещь?
Используйте поисковые пути: 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]);
Это разделение происходит непосредственно перед тем, как мы увидим нецифровую . Это намного ближе к вашему исходному решению, за исключением того, что поскольку оно фактически не соответствует нецифровому символу, оно не «съедает» его. Кроме того, он использует ограничение
из 2
, что вам и нужно.
String.split (String regex, int limit)
n
больше нуля, то шаблон будет применяться не более n - 1
раз, длина массива будет не больше, чем n
, а последняя запись массива будет содержать все входные данные за последним совпавшим разделителем. Всегда есть старый добрый способ:
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)};
}
(надеюсь, он работает и со строками, состоящими только из цифр или символов - не могу проверить это здесь - если нет, примите это как общую идею)