Вопрос: Как разбить строку на Java


У меня есть строка, "004-034556", что я хочу разбить на две строки:

string1=004
string2=034556

Это означает, что первая строка будет содержать символы до '-', а вторая строка будет содержать символы после '-', Я также хочу проверить, имеет ли строка '-'в этом. Если нет, я сделаю исключение. Как я могу это сделать?


1251


источник


Ответы:


Просто используйте соответствующий метод: String#split(),

String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556

Обратите внимание, что это требует регулярное выражение , так что не забудьте сбежать специальные символы если необходимо.

там 12 символов со специальными значениями: обратная косая черта \, каретка ^, знак доллара $, период или точка ., символ вертикальной полосы или трубы |, знак вопроса ?, звездочкой или звездой *, знак плюса +, открывающая скобка (, закрывающая скобка ), а квадратная скобка открытия [, открывающая фигурная скобка {Эти специальные символы часто называют «метасимволами».

Итак, если вы хотите разделить на, например, Период / точка .что значит " любой символ "в регулярном выражении используйте либо обратный слэш \чтобы избежать индивидуального особого персонажа, подобного split("\\."), или использовать класс символов []для представления буквенного символа (ов) split("[.]"), или использовать Pattern#quote()избежать всей строки split(Pattern.quote(".")),

String[] parts = string.split(Pattern.quote(".")); // Split on period.

Чтобы проверить заранее, если строка содержит определенные символы (символы), просто используйте String#contains(),

if (string.contains("-")) {
    // Split it.
} else {
    throw new IllegalArgumentException("String " + string + " does not contain -");
}

Обратите внимание, что это не принимает регулярного выражения. Для этого используйте String#matches()вместо.

Если вы хотите сохранить символ разделения в результирующих частях, используйте позитивный взгляд , Если вы хотите, чтобы символ разделения был в левой части, используйте положительный lookbehind путем префикса ?<=группы по шаблону.

String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556

Если вы хотите, чтобы символ разделения был в правой части, используйте положительный результат с помощью префикса ?=группы по шаблону.

String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556

Если вы хотите ограничить количество результирующих частей, вы можете указать желаемое число как 2-й аргумент split()метод.

String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42

2305



Альтернативой обработке строки непосредственно было бы использование регулярного выражения с группами захвата. Преимущество этого заключается в том, что он делает очевидным более сложное ограничение ввода. Например, следующее разделяет строку на две части и гарантирует, что оба они состоят только из цифр:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class SplitExample
{
    private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");

    public static void checkString(String s)
    {
        Matcher m = twopart.matcher(s);
        if (m.matches()) {
            System.out.println(s + " matches; first part is " + m.group(1) +
                               ", second part is " + m.group(2) + ".");
        } else {
            System.out.println(s + " does not match.");
        }
    }

    public static void main(String[] args) {
        checkString("123-4567");
        checkString("foo-bar");
        checkString("123-");
        checkString("-4567");
        checkString("123-4567-890");
    }
}

Поскольку шаблон исправлен в этом экземпляре, он может быть скомпилирован заранее и сохранен как статический член (инициализированный в момент загрузки класса в примере). Регулярное выражение:

(\d+)-(\d+)

Скобки обозначают группы захвата; строка, которая соответствует этой части регулярного выражения, может быть получена методом Match.group (), как показано. Символы \ d соответствуют и одиночная десятичная цифра, а символ + означает «соответствие одному или нескольким из предыдущего выражения». - Не имеет особого значения, поэтому просто соответствует этому символу на входе. Обратите внимание, что вам нужно удвоить обратную косую черту при написании этого как строки Java. Некоторые другие примеры:

([A-Z]+)-([A-Z]+)          // Each part consists of only capital letters 
([^-]+)-([^-]+)            // Each part consists of characters other than -
([A-Z]{2})-(\d+)           // The first part is exactly two capital letters,
                           // the second consists of digits

67



String[] result = yourString.split("-");
if (result.length != 2) 
     throw new IllegalArgumentException("String not in correct format");

Это разделит вашу строку на 2 части. Первый элемент в массиве будет частью, содержащей материал до -, а второй элемент в массиве будет содержать часть вашей строки после -,

Если длина массива не равна 2, строка не была в формате: string-string,

Проверьте split()метода в Stringкласс.

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-


36



// This leaves the regexes issue out of question
// But we must remember that each character in the Delimiter String is treated
// like a single delimiter        

public static String[] SplitUsingTokenizer(String subject, String delimiters) {
   StringTokenizer strTkn = new StringTokenizer(subject, delimiters);
   ArrayList<String> arrLis = new ArrayList<String>(subject.length());

   while(strTkn.hasMoreTokens())
      arrLis.add(strTkn.nextToken());

   return arrLis.toArray(new String[0]);
}

25



String[] out = string.split("-");

должен делать то, что вы хотите. Класс String имеет много методов для работы со строкой.


21



Требования оставляли место для устного перевода. Я рекомендую написать метод,

public final static String[] mySplit(final String s)

которые инкапсулируют эту функцию. Конечно, вы можете использовать String.split (..), как указано в других ответах на реализацию.

Вы должны написать некоторые модульные тесты для входных строк и желаемые результаты и поведение.

Хорошие кандидаты на тестирование должны включать:

 - "0022-3333"
 - "-"
 - "5555-"
 - "-333"
 - "3344-"
 - "--"
 - ""
 - "553535"
 - "333-333-33"
 - "222--222"
 - "222--"
 - "--4555"

С определением соответствующих результатов теста вы можете указать поведение.

Например, если "-333"должен вернуться в [,333]или если это ошибка. Можно "333-333-33"разделяться [333,333-33] or [333-333,33]или это ошибка? И так далее.


16



При условии, что

  • вам не нужны регулярные выражения для вашего раскола
  • вы уже используете apache commons lang в своем приложении

Самый простой способ - использовать StringUtils # split (java.lang.String, char) , Это более удобно, чем тот, который предоставляется Java из коробки, если вам не нужны регулярные выражения. Как и в его руководстве, он работает следующим образом:

A null input String returns null.

 StringUtils.split(null, *)         = null
 StringUtils.split("", *)           = []
 StringUtils.split("a.b.c", '.')    = ["a", "b", "c"]
 StringUtils.split("a..b.c", '.')   = ["a", "b", "c"]
 StringUtils.split("a:b:c", '.')    = ["a:b:c"]
 StringUtils.split("a b c", ' ')    = ["a", "b", "c"]

Я бы рекомендовал использовать commong-lang, так как обычно он содержит много полезного материала. Однако, если вам это не нужно ни для чего другого, кроме разделения, тогда реализация или вытеснение регулярного выражения - лучший вариант.


14



Use org.apache.commons.lang.StringUtils' split method which can split strings based on the character or string you want to split.

Method signature:

public static String[] split(String str, char separatorChar);

In your case, you want to split a string when there is a "-".

You can simply do as follows:

String str = "004-034556";

String split[] = StringUtils.split(str,"-");

Output:

004
034556

Assume that if - does not exists in your string, it returns the given string, and you will not get any exception.


14



You can try like this also

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");

13



With Java 8:

    List<String> stringList = Pattern.compile("-")
            .splitAsStream("004-034556")
            .collect(Collectors.toList());

    stringList.forEach(s -> System.out.println(s));

13