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

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

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

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

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

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

Ответы [ 33 ]

13 голосов
/ 02 декабря 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.

13 голосов
/ 13 мая 2015

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

Splitter.on('-')
       .trimResults()
       .omitEmptyStrings()
       .split(string);
11 голосов
/ 20 марта 2014

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

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 '-'
}
10 голосов
/ 13 декабря 2017

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

  1. String.split ():

    String[] parts ="10,20".split(",");
    
  2. Pattern.compile (regexp) .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 Splitter:

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

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

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

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

10 голосов
/ 15 марта 2014
public class SplitTest {

    public static String[] split(String text, String delimiter) {
        java.util.List<String> parts = new java.util.ArrayList<String>();

        text += delimiter;

        for (int i = text.indexOf(delimiter), j=0; i != -1;) {
            String temp = text.substring(j,i);
            if(temp.trim().length() != 0) {
                parts.add(temp);
            }
            j = i + delimiter.length();
            i = text.indexOf(delimiter,j);
        }

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


    public static void main(String[] args) {
        String str = "004-034556";
        String delimiter = "-";
        String result[] = split(str, delimiter);
        for(String s:result)
            System.out.println(s);
    }
}
9 голосов
/ 02 октября 2016
import java.io.*;

public class BreakString {

  public static void main(String args[]) {

    String string = "004-034556-1234-2341";
    String[] parts = string.split("-");

    for(int i=0;i<parts.length;i++) {
      System.out.println(parts[i]);
    }
  }
}
9 голосов
/ 01 сентября 2014

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

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

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

String textStr[] = yourString.split("-");
8 голосов
/ 09 января 2017

Вы можете использовать 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("-");
    }
}
7 голосов
/ 18 мая 2016

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

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

И, как ожидается, он выведет:

[004, 034556]

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

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

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

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

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

7 голосов
/ 04 октября 2015

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