如何在Java中分割string

我有一个string"004-034556" ,我想分成两个string:

 string1=004 string2=034556 

这意味着第一个string将包含'-'之前的字符,第二个string将包含'-'之后的字符。 我也想检查一下string是否有'-' 。 如果没有,我会抛出一个exception。 我该怎么做?

只需使用适当的方法: String#split()

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

请注意,这需要一个正则expression式 ,所以如有必要,请记住要转义特殊字符 。

有 12个特殊含义的字符:反斜杠\ ,插入符号^ ,美元符号$ ,句点或点. ,竖线或竖线符号| ,问号? ,星号或星号* ,加号+ ,开括号( ,右括号)和开方括号[ ,开口大括号{ ,这些特殊字符通常被称为“元字符”。

所以,如果你想分割如期/点. 这意味着正则expression式中的“ 任何字符 ”,使用反斜杠\来转义个别特殊字符,比如split("\\.") ,或者使用字符类[]来表示字符split("[.]") ,或者使用Pattern#quote()来转义像split(Pattern.quote("."))的整个string。

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

要预先testingstring是否包含某些字符,只需使用String#contains()

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

请注意,这不需要正则expression式。 为此,请使用String#matches()

如果你想保留分割字符在结果部分,然后利用正面的查找 。 如果您想要将分割字符放在左侧,请在模式前加上?<= group来使用正向lookbehind。

 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 

如果你想限制结果部分的数量,那么你可以提供所需的数字作为split()方法的第二个参数。

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

直接处理string的替代方法是使用捕获组的正则expression式。 这具有的优点是,它使得直接暗示更复杂的input限制。 例如,以下内容将string分成两部分,并确保两个字符都只包含数字:

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

由于该模式在这种情况下是固定的,因此可以预先编译并存储为静态成员(在本例中的类加载时初始化)。 正则expression式是:

 (\d+)-(\d+) 

括号表示捕获组; 匹配正则expression式部分的string可以通过Match.group()方法访问,如图所示。 \ d匹配单个十进制数字,+表示匹配一个或多个前面的expression式) – 没有特殊含义,所以只需要匹配input中的那个字符。注意,你需要双重转义反斜线当把它写成一个Javastring时,还有一些例子:

 ([AZ]+)-([AZ]+) // Each part consists of only capital letters ([^-]+)-([^-]+) // Each part consists of characters other than - ([AZ]{2})-(\d+) // The first part is exactly two capital letters, // the second consists of digits 
 String[] result = yourString.split("-"); if (result.length != 2) throw new IllegalArgumentException("String not in correct format"); 

这将把你的string分成两部分。 数组中的第一个元素将是包含-之前的东西的部分,而数组中的第二个元素将包含-之后的string部分。

如果数组长度不是2,那么该string的格式不是: string-string

检查String类中的split()方法。

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

 // 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]); } 
 String[] out = string.split("-"); 

应该做你想要的事情。 string类有很多方法来操作string。

这些要求留下了解释的余地​​。 我build议写一个方法,

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

它封装了这个函数。 当然你可以使用String.split(..),如其他答案中提到的那样。

你应该为inputstring和期望的结果和行为编写一些unit testing。

好的考生应该包括:

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

通过定义相应的testing结果,您可以指定行为。

例如,如果"-333"应该在[,333]返回,或者是错误。 "333-333-33"可以在[333,333-33] or [333-333,33]分开还是错误? 等等。

你也可以试试

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

假如说

  • 你并不需要正则expression式来分割
  • 你碰巧已经在你的应用程序中使用apache commons lang

最简单的方法是使用StringUtils#split(java.lang.String,char) 。 如果您不需要正则expression式,那么比起Java提供的那个方法更方便。 就像它的手册说的那样,它是这样工作的:

 A null input String returns null. StringUtils.split(null, *) = null StringUtils.split("", *) = [] StringUtils.split("abc", '.') = ["a", "b", "c"] StringUtils.split("a..bc", '.') = ["a", "b", "c"] StringUtils.split("a:b:c", '.') = ["a:b:c"] StringUtils.split("abc", ' ') = ["a", "b", "c"] 

我会推荐使用commong-lang,因为通常它包含很多可用的东西。 然而,如果你不需要它做任何事情比做一个分裂,然后实施自己或逃避正则expression式是一个更好的select。

使用org.apache.commons.lang.StringUtils的 split方法,它可以根据要分割的字符或string拆分string。

方法签名:

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

在你的情况下,你想要分割一个string,当有一个“ – ”。

你可以简单地做如下:

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

输出:

 004 034556 

假设如果-你的string中不存在,它会返回给定的string,并且不会有任何exception。

使用Java 8:

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

对于简单的用例String.split()应该做的工作。 如果您使用番石榴,还有一个Splitter类允许链接不同的string操作并支持CharMatcher :

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

string使用正则expression式分割多个字符

 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 ,其中第一个空string被忽略。 这个bug在最新的JDK版本中不存在,但是它存在于JDK 1.7迟到版本和1.8早期版本之间的一些版本中。

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

您可以使用以下语句通过换行符分割一个string:

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

您可以使用以下语句通过连字符/字符拆分string:

 String textStr[] = yourString.split("-"); 
 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]); } } } 

最耗费资源最less的方法是:

 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 '-' } 

一种方法是在for-each循环中遍历string,并使用所需的分割字符。

 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 

请不要使用StringTokenizer类,因为它是为了兼容性而保留的遗留类,在新代码中不鼓励使用它。 而且我们也可以使用别人build议的拆分方法。

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

和预期的一样,它会打印:

 [004, 034556] 

在这个答案中,我也想指出Java 8中split方法发生的一个变化 。 String#split()方法使用Pattern.split ,现在它将在结果数组的开始处移除空string。 注意Java 8文档中的这个变化 :

如果在input序列的开始处存在正宽度匹配,则在结果数组的开头会包含一个空的前导子string。 在开始处的零宽度匹配从不产生这样的空领先子string。

这意味着下面的例子:

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

我们会得到三个string: [0, 0, 4]而不是Java 7和之前的情况。 也检查这个类似的问题 。

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

希望它帮助.. 🙂

以下是两种实现方法

方法1:由于你必须用特殊字符分割两个数字,你可以使用正则expression式

 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:使用string拆分方法

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

您可以使用StringTokenizer将string拆分为两个或更多部分,不pipe它们是否是任何types的分隔符:

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

查看javadoc上String类的split()方法。

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++; } 

这里有很多分割string的例子,但我对代码进行了优化

 String str="004-034556" String[] sTemp=str.split("-");// '-' is a delimiter string1=004 // sTemp[0]; string2=034556//sTemp[1]; 
 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()是您可以使用的最佳select。 另一种方法是使用substring()。

要分割一个string,请使用String.split(regex)

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

输出:

004
034556

从文档:

public String[] split(String regex,int limit) 围绕给定正则expression式的匹配拆分此string 。 此方法返回的数组包含此string的每个子string,该string由与给定expression式匹配的另一个子string终止,或者由string的末尾终止。 数组中的子string按照它们在此string中出现的顺序排列 。 如果expression式匹配input的任何部分,那么结果数组只有一个元素即这个string。

所以基本上你可以做的是这样的:

 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 
  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 containing +那么它不会分裂; 相反,你会得到一个runtime error 。 在这种情况下,首先replace + to _ ,然后拆分:

  this.text=text.replace("/", "_"); String temp[]=text.split("_");