如何在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个字符具有特殊含义:反斜线 ,插入符号^ ,美元符号$ ,句点或点. ,竖线或竖线符号| ,问号? ,星号或星号* ,加号+ ,左圆括号( ,右圆括号)和开方括号[ ,开口大括号{ ,这些特殊字符通常称为“元字符”。

所以,如果你想分割例如周期/点. 这意味着正则表达式中的“任何字符”,使用反斜杠来转义单独的特殊字符,例如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

直接处理字符串的替代方法是使用带捕获组的正则表达式。 这具有的优点是,它使得直观暗示对输入更复杂的约束。 例如,以下内容将字符串拆分为两部分,并确保两部分仅包含数字:

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-

链接地址: http://www.djcxy.com/p/3557.html

上一篇: How to split a string in Java

下一篇: How do I check if a string is a number (float)?