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