java - substring字符串 - 字符串查找
如何在Java中分割字符串 (20)
我有一个字符串"004-034556"
,我想分成两个字符串:
string1=004
string2=034556
这意味着第一个字符串将包含'-'
之前的字符,第二个字符串将包含'-'
之后的字符。 我也想检查一下字符串是否有'-'
。 如果没有,我会抛出异常。 我怎样才能做到这一点?
字符串使用正则表达式分割多个字符
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早期版本之间的某些版本中。
一种方法是在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
以下两种方式可以实现它。
方法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);
}
}
}
你也可以尝试这样
String concatenated_String="hi^Hello";
String split_string_array[]=concatenated_String.split("\\^");
使用org.apache.commons.lang.StringUtils' split方法,它可以根据要分割的字符或字符串拆分字符串。
方法签名:
public static String[] split(String str, char separatorChar);
在你的情况下,当有一个“ - ”时你想分割一个字符串。
你可以简单地做如下操作:
String str = "004-034556";
String split[] = StringUtils.split(str,"-");
输出:
004
034556
假设如果-
在您的字符串中不存在,它将返回给定的字符串,并且不会发生任何异常。
使用Java 8:
List<String> stringList = Pattern.compile("-")
.splitAsStream("004-034556")
.collect(Collectors.toList());
stringList.forEach(s -> System.out.println(s));
只需使用适当的方法: String#split()
。
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
请注意,这需要一个正则表达式 ,所以如有必要请记住要转义特殊字符 。
有 12个字符具有特殊含义:反斜线
\
,插入符号^
,美元符号$
,句点或点.
,竖线或竖线符号|
,问号?
,星号或星号*
,加号+
,左圆括号(
,右圆括号)
和开方括号[
,开口大括号{
,这些特殊字符通常称为“元字符”。
所以,如果你想分割例如周期/点.
这意味着正则表达式中的“ 任何字符 ”,使用反斜杠\
来转义单独的特殊字符,例如split("\\.")
,或者使用字符类[]
来表示文字字符,就像split("[.]")
,或者使用Pattern#quote()
来转义像split(Pattern.quote("."))
这样的整个字符串。
String[] parts = string.split(Pattern.quote(".")); // Split on period.
要预先测试字符串是否包含某些字符,只需使用String#contains()
。
if (string.contains("-")) {
// Split it.
} else {
throw new IllegalArgumentException("String " + string + " does not contain -");
}
请注意,这不需要正则表达式。 为此,请使用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#split()应该完成这项工作。 如果您使用番石榴,还有一个Splitter类,它允许链接不同的字符串操作并支持CharMatcher :
Splitter.on('-')
.trimResults()
.omitEmptyStrings()
.split(string);
您可以使用以下语句通过换行符拆分字符串:
String textStr[] = yourString.split("\\r?\\n");
您可以使用以下语句通过连字符/字符拆分字符串:
String textStr[] = yourString.split("-");
我只想写一个算法,而不是使用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;
}
查看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 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 '-'
}
要分割一个字符串,使用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]);
}
}
}