java - split多個符號 - string分割




如何在Java中分割字符串 (20)

字符串使用正則表達式分割多個字符

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版本中存在的bug 。 這個bug在最新的JDK版本中不存在,但它存在於JDK 1.7遲到版本和1.8早期版本之間的某些版本中。

我有一個字符串"004-034556" ,我想分成兩個字符串:

string1=004
string2=034556

這意味著第一個字符串將包含'-'之前的字符,第二個字符串將包含'-'之後的字符。 我也想檢查一下字符串是否有'-' 。 如果沒有,我會拋出異常。 我怎樣才能做到這一點?


一種方法是在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

你也可以嘗試這樣

 String concatenated_String="hi^Hello";

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

你可以使用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("-");
    }
}

使用Java 8:

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

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

假如說

  • 你並不需要正則表達式來分割
  • 你碰巧已經在你的應用中使用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,因為通常它包含很多可用的東西。 但是,如果你不需要它來進行分割,那麼實現自己或者轉義正則表達式是更好的選擇。


對於簡單的用例String#split()應該完成這項工作。 如果您使用番石榴,還有一個Splitter類,它允許鏈接不同的字符串操作並支持CharMatcher

Splitter.on('-')
       .trimResults()
       .omitEmptyStrings()
       .split(string);

從文檔:

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

我只想寫一個算法,而不是使用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;
}


無論是否有任何類型的分隔符,您都可以簡單地使用StringTokenizer將字符串拆分為兩個或更多部分:

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

直接處理字符串的替代方法是使用帶捕獲組的正則表達式。 這具有的優點是,它使得直觀暗示對輸入更複雜的約束。 例如,以下內容將字符串拆分為兩部分,並確保兩部分僅包含數字:

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

要分割一個字符串,使用String.split(正則表達式)。 查看以下示例:

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

產量

004
034556

注意這個split(正則表達式)以正則表達式作為參數,記得要轉義正則表達式的特殊字符,如句點/點。


要分割一個字符串,請使用String.split(regex)

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

輸出:

004
034556

這些要求留下了解釋的餘地。 我建議寫一個方法,

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]分開還是錯誤? 等等。


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

如果你有一個特殊的字符,那麼你可以使用Patter.quote。 如果你只有短劃線( - ),那麼你可以縮短代碼:

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

如果您嘗試添加其他特殊字符以代替破折號(^),則該錯誤將生成ArrayIndexOutOfBoundsException 。 為此你必須使用Pattern.quote


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()。


String str="004-034556"
String[] sTemp=str.split("-");// '-' is a delimiter

string1=004 // sTemp[0];
string2=034556//sTemp[1];

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

這將把你的字符串分成兩部分。 數組中的第一個元素將是包含-之前的東西的部分,數組中的第二個元素將包含-之後的部分字符串。

如果數組長度不是2,那麼該字符串的格式不是: string-string

查看String類中的split()方法。

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


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






string