如何在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("_");