Нужно разделить строку на две части в Java

У меня есть строка, которая содержит непрерывный кусок цифр, а затем непрерывный кусок символов. Мне нужно разделить их на две части (одну целочисленную часть и одну строку).

Я попытался с помощью String.split("D", 1), но это съедает первого персонажа. Я проверил все строковые API и не нашел подходящего метода.

есть ли способ сделать это?

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

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