Нужно разбить строку на две части в 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),

Рекомендации

Смежные вопросы


Альтернативное решение с использованием ограниченного разделения

Следующее также работает:

    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)};
}

(надеюсь, что он работает и со строками, состоящими только из цифр или только из символов) - не можете проверить это здесь - если нет, примите это как общую идею)

Другие вопросы по тегам