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

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

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

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


person riyana    schedule 14.08.2010    source источник


Ответы (33)


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

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

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

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

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

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

Чтобы заранее проверить, содержит ли строка определенные символы, просто используйте _ 23_.

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

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

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

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

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

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
person BalusC    schedule 14.08.2010
comment
Почему вы используете хеш-символы для разделения методов String? - person Crowie; 01.08.2013
comment
@Crowie: в стиле javadoc. - person BalusC; 01.08.2013
comment
Угловой случай: если он не может найти reugalr expression, он возвращает один массив элементов со всей строкой. - person klimat; 23.05.2016
comment
Вы сэкономили мне время, я забыл процитировать точку (.)! - person KYHSGeekCode; 30.10.2018
comment
Не могу поверить, что эта версия получила наибольшее количество голосов. 1) part2 - это не то, что хочет плакат, если исходная строка содержит два - 2) Нет обработки ошибок, как указано в вопросе. 3) Низкая эффективность. Односимвольный поиск требует построения и сопоставления регулярных выражений. Создан дополнительный массив и т. Д. - person David; 18.01.2019
comment
@David: 1) Это не рассматривается в вопросе. 2) Не вызывает исключений. 3) OP спрашивает, как разбить, а не как подстроку. 4) Сделайте перерыв, глубоко вдохните и выбросьте весь негатив в голову :) - person BalusC; 18.01.2019

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

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
person Rob Hague    schedule 14.08.2010
comment
Это отличное решение, однако первая часть должна быть m.group(1), вторая часть m.group(2), поскольку m.group(0) фактически возвращает полный шаблон соответствия. Думаю, я также помню, что group(0) раньше было первым совпадением, а не полным шаблоном, возможно, это изменилось в недавнем обновлении версии Java. - person ptstone; 13.07.2017

Использовать:

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

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

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

Ознакомьтесь с split () в классе String.

person jjnguy    schedule 14.08.2010
comment
Это примет -555 в качестве входных данных и вернет [, 555]. Требования не определены так ясно, если это действительно так. Я рекомендую написать несколько модульных тестов, чтобы определить желаемое поведение. - person Michael Konietzka; 14.08.2010
comment
Вероятно, безопаснее всего изменить (result.length! = 2) на (result.length ‹2) - person Uncle Iroh; 10.02.2014

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

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

person secmask    schedule 14.08.2010

С Java 8:

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

    stringList.forEach(s -> System.out.println(s));
person Somaiah Kumbera    schedule 01.12.2016
comment
Если вы хотите удалить пробелы, добавьте .map(String::trim) после split - person Roland; 10.03.2017

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

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] или это ошибка? И так далее.

person Michael Konietzka    schedule 14.08.2010
comment
Полезный совет, но не ответ на вопрос. Если вы поддерживаете другой ответ с подробностями, комментарий предпочтительнее. - person Chris Mountford; 25.08.2014
comment
Используйте: split (String regex, int limit) и NOT split (String regex) для справочного посещения geeksforgeeks.org/split-string-java-examples - person Ryan Augustine; 20.09.2018

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

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");
person SHUNMUGA RAJ PRABAKARAN    schedule 15.01.2013

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

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

person eis    schedule 25.03.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

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

person sandeep vanama    schedule 01.07.2014

Подводя итог: существует как минимум пять способов разбить строку в Java:

  1. String.split ():

    String[] parts ="10,20".split(",");
    
  2. Pattern.compile (регулярное выражение) .splitAsStream (ввод):

    List<String> strings = Pattern.compile("\\|")
          .splitAsStream("010|020202")
          .collect(Collectors.toList());
    
  3. StringTokenizer (унаследованный класс):

    StringTokenizer strings = new StringTokenizer("Welcome to EXPLAINJAVA.COM!", ".");
    while(strings.hasMoreTokens()){
        String substring = strings.nextToken();
        System.out.println(substring);
    }
    
  4. Разделитель Google Guava:

    Iterable<String> result = Splitter.on(",").split("1,2,3,4");
    
  5. Apache Commons StringUtils:

    String[] strings = StringUtils.split("1,2,3,4", ",");
    

Таким образом, вы можете выбрать лучший вариант в зависимости от того, что вам нужно, например тип возвращаемого значения (массив, список или итерируемый).

Здесь представлен большой обзор этих методов и наиболее распространенных примеров (как разбить точку, косая черта, вопросительный знак и т. д.)

person Dmytro Shvechikov    schedule 13.12.2017

Самым быстрым способом, который потребляет меньше всего ресурсов, может быть:

String s = "abc-def";
int p = s.indexOf('-');
if (p >= 0) {
    String left = s.substring(0, p);
    String right = s.substring(p + 1);
} else {
  // s does not contain '-'
}
person David    schedule 20.03.2014
comment
Самый дефицитный ресурс - это время и внимание программиста. Этот код потребляет больше ресурсов, чем альтернативы. - person Chris Mountford; 25.08.2014
comment
у вас есть много встроенных ресурсов, которые вы можете использовать, там, где производительность действительно учитывается, этому решению не хватает времени выполнения производительности - person J Sanchez; 22.04.2016
comment
Выполнить простое разделение на один символ с проверкой ошибок не сложнее, чем версия с регулярным выражением. - person tekHedd; 17.01.2019
comment
Браво! Наконец, ответ на этот вопрос, который не использует регулярное выражение! Использование регулярного выражения для этой простой задачи - это скорее проблема. Приятно видеть, что на этой земле еще есть здравомыслящие программисты :-) - person Gabriel Magana; 22.03.2019
comment
Есть только один -, требуется исключение, и результат должен перейти в строку1 и строку2. Сделайте из нее string1 = s.substring(0, s.indexOf("-")); string2 = s.substring(s.indexOf("-") + 1);. Вы получите StringIndexOutOfBoundsException автоматически, если не было -. - person Kaplan; 17.04.2020

Для простых случаев использования String.split() должен выполнить свою работу. Если вы используете гуаву, существует также класс Splitter, который позволяет объединять различные строковые операции и поддерживает CharMatcher:

Splitter.on('-')
       .trimResults()
       .omitEmptyStrings()
       .split(string);
person Vitalii Fedorenko    schedule 13.05.2015

Разделение строки на несколько символов с помощью регулярного выражения

public class StringSplitTest {
     public static void main(String args[]) {
        String s = " ;String; String; String; String, String; String;;String;String; String; String; ;String;String;String;String";
        //String[] strs = s.split("[,\\s\\;]");
        String[] strs = s.split("[,\\;]");
        System.out.println("Substrings length:"+strs.length);
        for (int i=0; i < strs.length; i++) {
            System.out.println("Str["+i+"]:"+strs[i]);
        }
     }
  }

Выход:

Substrings length:17
Str[0]:
Str[1]:String
Str[2]: String
Str[3]: String
Str[4]: String
Str[5]: String
Str[6]: String
Str[7]:
Str[8]:String
Str[9]:String
Str[10]: String
Str[11]: String
Str[12]:
Str[13]:String
Str[14]:String
Str[15]:String
Str[16]:String

Но не ожидайте одинакового вывода во всех версиях JDK. Я видел одну ошибку, которая существует в некоторых версиях JDK, где первая пустая строка имеет были проигнорированы. Этой ошибки нет в последней версии JDK, но она существует в некоторых версиях между поздними версиями JDK 1.7 и ранними версиями 1.8.

person Ravindra babu    schedule 02.12.2015

Вы можете разделить строку разрывом строки, используя следующий оператор:

String textStr[] = yourString.split("\\r?\\n");

Вы можете разделить строку дефисом / символом, используя следующую инструкцию:

String textStr[] = yourString.split("-");
person RajeshVijayakumar    schedule 01.09.2014

Вам действительно нужно рассмотреть только два метода.

Используйте String.split для односимвольного разделителя, иначе производительность вас не волнует

Если производительность не является проблемой или если разделитель представляет собой отдельный символ, который не является специальным символом регулярного выражения (т.е. не является одним из .$|()[{^?*+\), вы можете использовать String.split.

String[] results = input.split(",");

В методе разделения есть оптимизация, позволяющая избежать использования регулярного выражения, если разделитель представляет собой один символ, а не в приведенном выше списке. В противном случае ему придется скомпилировать регулярное выражение, а это не идеально.

Используйте Pattern.split и предварительно скомпилируйте шаблон, если вы используете сложный разделитель и вам важна производительность.

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

// Save this somewhere
Pattern pattern = Pattern.compile("[,;:]");

/// ... later
String[] results = pattern.split(input);

Эта последняя опция по-прежнему создает новый объект Matcher. Вы также можете кэшировать этот объект и сбрасывать его для каждого ввода для максимальной производительности, но это несколько сложнее и не является поточно-ориентированным.

person rghome    schedule 20.11.2018

Один из способов сделать это - пройти через String в цикле for-each и использовать требуемый символ разделения.

public class StringSplitTest {

    public static void main(String[] arg){
        String str = "004-034556";
        String split[] = str.split("-");
        System.out.println("The split parts of the String are");
        for(String s:split)
        System.out.println(s);
    }
}

Выход:

The split parts of the String are:
004
034556
person Keshav Pradeep Ramanath    schedule 04.10.2015

Пожалуйста, не используйте класс StringTokenizer как он - это устаревший класс, который сохранен по соображениям совместимости, и его использование в новом коде не рекомендуется. И мы можем использовать метод разделения, как предлагают другие.

String[] sampleTokens = "004-034556".split("-");
System.out.println(Arrays.toString(sampleTokens));

И, как и ожидалось, он напечатает:

[004, 034556]

В этом ответе я также хочу указать на одно изменение, которое произошло для метода split в Java 8. Разделение строки # () использует Pattern.split, и теперь он удаляет пустые строки в начале массива результатов. Обратите внимание на изменение в документации по Java 8:

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

Это означает для следующего примера:

String[] sampleTokensAgain = "004".split("");
System.out.println(Arrays.toString(sampleTokensAgain));

мы получим три строки: [0, 0, 4], а не четыре, как было в Java 7 и ранее. Также проверьте этот аналогичный вопрос.

person akhil_mittal    schedule 18.05.2016

Вы можете использовать Split ():

import java.io.*;

public class Splitting
{

    public static void main(String args[])
    {
        String Str = new String("004-034556");
        String[] SplittoArray = Str.split("-");
        String string1 = SplittoArray[0];
        String string2 = SplittoArray[1];
    }
}

В противном случае вы можете использовать StringTokenizer:

import java.util.*;
public class Splitting
{
    public static void main(String[] args)
    {
        StringTokenizer Str = new StringTokenizer("004-034556");
        String string1 = Str.nextToken("-");
        String string2 = Str.nextToken("-");
    }
}
person Sarat Chandra    schedule 09.01.2017

Вот два способа добиться этого.

СПОСОБ 1: поскольку вам нужно разделить два числа специальным символом, вы можете использовать регулярное выражение

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

public class TrialClass
{
    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("[0-9]+");
        Matcher m = p.matcher("004-034556");

        while(m.find())
        {
            System.out.println(m.group());
        }
    }
}

СПОСОБ 2: Использование метода разделения строк

public class TrialClass
{
    public static void main(String[] args)
    {
        String temp = "004-034556";
        String [] arrString = temp.split("-");
        for(String splitString:arrString)
        {
            System.out.println(splitString);
        }
    }
}
person Akshay Gaikwad    schedule 03.03.2017

Вы можете просто использовать StringTokenizer для разделения строки на две или более частей, независимо от того, есть ли какие-либо типы разделителей:

StringTokenizer st = new StringTokenizer("004-034556", "-");
while(st.hasMoreTokens())
{
    System.out.println(st.nextToken());
}
person Rohit-Pandey    schedule 17.04.2017

Ознакомьтесь с методом split() в классе String на javadoc.

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

String data = "004-034556-1212-232-232";
int cnt = 1;
for (String item : data.split("-")) {
        System.out.println("string "+cnt+" = "+item);
        cnt++;
}

Здесь много примеров для разделенной строки, но я немного оптимизировал код.

person Divyesh Kanzariya    schedule 09.05.2016
comment
Замени - на | и посмотрим, что получится :) - person R Sun; 06.10.2019
comment
В этом случае установите флажок stackoverflow.com/questions/10796160/ - person R Sun; 06.10.2019

Я просто хотел написать алгоритм вместо использования встроенных функций Java:

public static List<String> split(String str, char c){
    List<String> list = new ArrayList<>();
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.length(); i++){
        if(str.charAt(i) != c){
            sb.append(str.charAt(i));
        }
        else{
            if(sb.length() > 0){
                list.add(sb.toString());
                sb = new StringBuilder();
            }
        }
    }

    if(sb.length() >0){
        list.add(sb.toString());
    }
    return list;
}
person None    schedule 10.01.2018

Вы можете использовать метод split:

public class Demo {
    public static void main(String args[]) {
        String str = "004-034556";

        if ((str.contains("-"))) {
            String[] temp = str.split("-");
            for (String part:temp) {
                System.out.println(part);
            }
        }
        else {
            System.out.println(str + " does not contain \"-\".");
        }
    }
}
person Jamith NImantha    schedule 07.12.2018

Для разделения строки используется String.split (регулярное выражение). Просмотрите следующие примеры:

String data = "004-034556";
String[] output = data.split("-");
System.out.println(output[0]);
System.out.println(output[1]);

Выход

004
034556

Примечание:

Это разбиение (регулярное выражение) принимает в качестве аргумента регулярное выражение. Не забудьте экранировать специальные символы регулярного выражения, такие как точка / точка.

person KIBOU Hassan    schedule 08.03.2018

String s="004-034556";
for(int i=0;i<s.length();i++)
{
    if(s.charAt(i)=='-')
    {
        System.out.println(s.substring(0,i));
        System.out.println(s.substring(i+1));
    }
}

Как уже говорили все, split () - лучший вариант, который можно использовать в вашем случае. Альтернативный метод может использовать substring ().

person SAM Jr    schedule 24.02.2017

Чтобы разделить строку, используйте String.split(regex):

String phone = "004-034556";
String[] output = phone.split("-");
System.out.println(output[0]);
System.out.println(output[1]);

Выход:

004
034556
person KIBOU Hassan    schedule 07.04.2017

 String string = "004^034556-34";
 String[] parts = string.split(Pattern.quote("^"));

Если у вас есть специальный символ, вы можете использовать Patter.quote. Если у вас просто тире (-), вы можете сократить код:

 String string = "004-34";
 String[] parts = string.split("-");

Если вы попытаетесь добавить другой специальный символ вместо тире (^), тогда возникнет ошибка ArrayIndexOutOfBoundsException. Для этого вам нужно использовать Pattern.quote.

person Aditya Singh    schedule 22.09.2017

Я использовал строку под названием stringValue, она имеет форму примерно такой: «Те, у кого были монеты, наслаждались дождем, те, у кого были записки, были заняты поисками убежища».

Я разделю stringValue, используя "," в качестве двоеточия.

И затем я просто хотел бы SetText () трех разных TextView для отображения этой строки.

String stringValue = "Those who had coins, enjoyed in the rain, those who had notes were busy looking for the shelter";
String ValueSplitByColon[] = stringValue.split(",");

String firstValue = ValueSplitByColon[0];
String secondValue = ValueSplitByColon[1];
String thirdValue = ValueSplitByColon[2];

txtV1.setText(firstValue);
txtV2.setText(secondValue;
txtV3.setText(thirdValue;

Он дает результат как:

  1. Значение txtV1: Те, у кого были монеты

  2. Значение txtV2: наслаждаются под дождем.

  3. Значение txtV3: те, у кого были заметки, были заняты поисками убежища.

person Pramesh Bhalala    schedule 26.08.2019

Из документации:

public String[] split(String regex,int limit) Разбивает эту строку вокруг совпадений с заданным регулярным выражением. Массив, возвращаемый этим методом, содержит каждую подстроку этой строки, которая заканчивается другой подстрокой, которая соответствует данному выражению, или заканчивается концом строки. Подстроки в массиве находятся в том порядке, в котором они встречаются в этой строке. Если выражение не соответствует какой-либо части ввода, тогда в результирующем массиве будет только один элемент, а именно эта строка.

В основном вы можете сделать что-то вроде этого:

String s = "123-456-789-123"; // The String to be split
String[] array = s.split("-"); // Split according to the hyphen and put them in an array
for(String subString : array){ // Cycle through the array
   System.out.println(subString);
}

Вывод:

123
456
789
123
person Community    schedule 14.05.2017

Я просмотрел все ответы и заметил, что все они либо имеют стороннюю лицензию, либо основаны на регулярных выражениях.

Вот хорошая тупая реализация, которую я использую:

/**
 * Separates a string into pieces using
 * case-sensitive-non-regex-char-separators.
 * <p>
 * &nbsp;&nbsp;<code>separate("12-34", '-') = "12", "34"</code><br>
 * &nbsp;&nbsp;<code>separate("a-b-", '-') = "a", "b", ""</code>
 * <p>
 * When the separator is the first character in the string, the first result is
 * an empty string. When the separator is the last character in the string the
 * last element will be an empty string. One separator after another in the
 * string will create an empty.
 * <p>
 * If no separators are set the source is returned.
 * <p>
 * This method is very fast, but it does not focus on memory-efficiency. The memory
 * consumption is approximately double the size of the string. This method is
 * thread-safe but not synchronized.
 *
 * @param source    The string to split, never <code>null</code>.
 * @param separator The character to use as splitting.
 * @return The mutable array of pieces.
 * @throws NullPointerException When the source or separators are <code>null</code>.
 */
public final static String[] separate(String source, char... separator) throws NullPointerException {
    String[] resultArray = {};
    boolean multiSeparators = separator.length > 1;
    if (!multiSeparators) {
        if (separator.length == 0) {
            return new String[] { source };
        }
    }
    int charIndex = source.length();
    int lastSeparator = source.length();
    while (charIndex-- > -1) {
        if (charIndex < 0 || (multiSeparators ? Arrays.binarySearch(separator, source.charAt(charIndex)) >= 0 : source.charAt(charIndex) == separator[0])) {
            String piece = source.substring(charIndex + 1, lastSeparator);
            lastSeparator = charIndex;
            String[] tmp = new String[resultArray.length + 1];
            System.arraycopy(resultArray, 0, tmp, 1, resultArray.length);
            tmp[0] = piece;
            resultArray = tmp;
        }
    }
    return resultArray;
}
person Grim    schedule 25.04.2020
comment
Почему голосование против? Пожалуйста, объясни. - person Grim; 17.01.2021

Иногда, если вы хотите разделить string containing +, он не будет разделен; вместо этого вы получите runtime error. В этом случае сначала replace + to _, а затем разделите:

 this.text=text.replace("/", "_");
            String temp[]=text.split("_");
person Community    schedule 07.02.2013
comment
Это потому, что аргумент для разделения является регулярным выражением. Лучшее решение - правильно экранировать регулярное выражение. - person Max; 27.03.2013

person    schedule
comment
В JavaDoc четко указано: StringTokenizer - это устаревший класс, который сохранен по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы любой, кто ищет эту функциональность, использовал вместо этого split метод String или java.util.regex. - person bvdb; 09.09.2013

person    schedule
comment
Если я могу поделиться советом, как ваш ответ имеет большую ценность, чем уже принятое решение? stackoverflow.com/a/3481842/420096 в таких ситуациях вы можете проголосовать за существующее решение, особенно если это ясный тривиальный случай вроде этого. - person Sombriks; 02.10.2016