Как разбить строку в Java - PullRequest
       49

Как разбить строку в Java

1496 голосов
/ 14 августа 2010

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

string1="004";
string2="034556";

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

Ответы [ 33 ]

2687 голосов
/ 14 августа 2010

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

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

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

там - это 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().

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

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
71 голосов
/ 14 августа 2010

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

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
41 голосов
/ 14 августа 2010
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-

28 голосов
/ 16 ноября 2012
// 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]);
}
28 голосов
/ 14 августа 2010
String[] out = string.split("-");

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

19 голосов
/ 01 декабря 2016

с Java 8:

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

    stringList.forEach(s -> System.out.println(s));
19 голосов
/ 14 августа 2010

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

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 голосов
/ 25 марта 2014

Предполагая, что

  • вам на самом деле не нужны регулярные выражения для вашего разделения
  • вы уже используете 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, поскольку обычно он содержит много полезного.Однако, если вам это не нужно для чего-то еще, кроме деления, тогда лучше реализовать себя или избежать регулярного выражения.

15 голосов
/ 15 января 2013

Вы можете попробовать так же

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");
15 голосов
/ 01 июля 2014

Используйте org.apache.commons.lang.StringUtils ' метод разделения, который может разделять строки на основе символа или строки, которую вы хотите разделить.

Подпись метода:

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

В вашем случае вы хотите разбить строку, когда есть "-".

Вы можете просто сделать следующее:

String str = "004-034556";

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

Выход:

004
034556

Предположим, что если - не существует в вашей строке, он возвращает данную строку, и вы не получите никакого исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...