Используйте lookarounds: 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
, что действительно то, что вы хотите здесь.
API ссылки
String.split(String regex, int limit)
- Если предел
n
больше нуля, то шаблон будет применен не более n - 1
раз, длина массива не будет превышать n
, а последняя запись массива будет содержать все входные данные, кроме последнего согласованный разделитель.