当前位置: 首页 > 知识库问答 >
问题:

如何在Java中拆分字符串

夹谷浩宕
2023-03-14

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

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

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

共有3个答案

赵高韵
2023-03-14

使用:

String[] result = yourString.split("-");
if (result.length != 2) 
     throw new IllegalArgumentException("String not in correct format");

这将把字符串分成两部分。数组中的第一个元素将包含-之前的内容,数组中的第二个元素将包含-之后的字符串部分。

如果数组长度不是2,则字符串的格式不是:string string

查看String类中的拆分()方法。

苏志
2023-03-14

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

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+)

括号表示捕获组;与regexp的这一部分匹配的字符串可以由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
乐正洲
2023-03-14

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

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

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

有12个具有特殊含义的字符:反斜杠\,插入符号^,美元符号$,句号或点,竖条或管道符号|,问号,星号或星号*,加号,开头括号,结尾括号,以及开头方括号[,开头花括号{,这些特殊字符通常被称为元字符。

所以,如果你想在句号/dot上拆分在正则表达式中表示“任何字符”,使用反斜杠\转义单个特殊字符,如sosplit(\\),或使用字符类[]来表示文本字符,如sosplit([.]),或者使用Pattern#quote()来转义整个字符串,比如sosplit(Pattern.quote(“.”)

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

要事先测试字符串是否包含某些字符,只需使用String#包含()

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

请注意,这不采用正则表达式。为此,请使用String#匹配()代替。

如果希望在生成的部分中保留分割字符,则使用正向环视。如果您想让拆分字符结束在左手边,请通过前缀使用正向查找?

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

 类似资料:
  • 我有输入字符串'~~'作为分隔符。 例如:字符串s=“1~~vijay~~25~~pune”;当我在Java中用'~\\~'拆分它时,它工作得很好。 还有其他人面临同样的问题吗?请就这个问题发表评论。

  • 问题内容: 在java中如何拆分一个字符串?如何使用split方法? 问题答案: “004-034556”为例用方法即可: 请注意,这需要一个正则表达式,因此请记住在必要时转义特殊字符。 _ 12个具有特殊含义的字符:反斜杠,插入符号,美元符号,句点或点,竖线或竖线符号,问号,星号或星号,加号,左括号,右括号,以及方括号,大括号,这些特殊字符通常称为“元字符”。 所以,如果你想在如期间分点.的意思

  • 我不想拆分我的字符串,以便hello的值得到“hello”,而hi的值得到“hi”

  • 问题内容: 我有以下字符串(Java 1.5): 我需要一个数组: 用Java最方便的方法是什么? 问题答案: 这将为您提供所需的数组,只有第一项为空。和: 这将使数组没有空的第一项。 此处的关键是零宽度正向超前(非捕获构造)(请参阅regex pattern docs)。 表示“或者;或:” 是字边界的-在那里是为了不将第一个视为定界符(因为它是序列的开头)

  • 问题内容: 我有一个,我想将其拆分为, 此拆分代码应适用于所有输入之王,例如ab123456和acff432等。如何拆分这种字符串。可能吗? 问题答案: 您可以尝试拆分像的正则表达式。试试这个: 将输出 您可以使用解析数字字符串为Integer 。

  • 问题内容: 我从网上得到一个字符串,看起来像这样: 然后,我需要将,和存储在不同的变量中,但是它将不起作用。 现在它只存储整个字符串 怎么了? 问题答案: 该参数是一个普通表达式,在那里有特殊含义;“开始的锚” 您需要做: 通过转义,您是在说“我的意思是字符’^’”