我有一个字符串, "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-