如何在 Java 中分割字符串

我有一个字符串"004-034556" ,我想分成两个字符串:

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

这意味着第一个字符串将包含'-'之前的字符,第二个字符串将包含'-'之后的字符。我还想检查字符串中是否包含'-' 。如果没有,我将抛出异常。我怎样才能做到这一点?

答案

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

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

请注意,这需要一个正则表达式 ,因此请记住在必要时转义特殊字符

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

因此,如果您想分割例如 period / dot .这表示正则表达式中的 “ 任何字符 ”,可以使用反斜杠\来转义单个特殊字符,例如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 前缀,以使用正向后视。

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

如果您希望分割字符以右侧结尾,请在模式前面加上?=组,以使用正向超前。

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

直接处理字符串的另一种方法是使用带有捕获组的正则表达式。这样做的好处是可以直接暗示对输入的更复杂的约束。例如,以下内容将字符串分成两部分,并确保两者均仅由数字组成:

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[] 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-

String[] out = string.split("-");

应该做你想做的事。字符串类有许多使用字符串的方法。

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

使用 Java 8:

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

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

要求留有解释的余地。我建议写一个方法,

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] or [333-333,33] "333-333-33"分开,还是错误?等等。

假如说

  • 您实际上不需要正则表达式进行拆分
  • 您碰巧已经在您的应用程序中使用了 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 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

假定如果-在您的字符串中不存在,它将返回给定的字符串,并且您不会获得任何异常。