让我们谈谈 Java 的String.split方法:它的作用以及为什么需要它。不难猜到它拆分了一个 Java 字符串,但它在实践中是如何工作的呢?让我们深入研究该方法的操作并讨论一些不明显的细节。同时,我们将了解String实际有多少种拆分方法。我们走吧!
请注意上表中最后两行之间的差异。在倒数第二行中,使用逗号作为分隔符。结果,当字符串被拆分时,一些单词有前导空格。在最后一行中,我们使用逗号和空格作为分隔符。这就是结果数组中没有带前导空格的子字符串的原因。这只是一个微妙的细节,它表明仔细选择正确的分隔符是多么重要。
Java 的 String.split 的描述和签名
在 Java 中,split方法使用使用正则表达式定义的定界符将字符串拆分为子字符串。让我们展示方法签名并开始我们的潜水:String[] split(String regex)
从签名中可以清楚地看出两件事:
- 该方法返回一个字符串数组。
- 该方法有一个名为regex 的字符串输入参数。
-
该方法返回一个字符串数组。
声明包含以下文字:“在 Java 中,split方法将字符串拆分为子字符串。” 该方法将这些子字符串收集到一个数组中,该数组成为返回值。
-
该方法有一个名为regex 的字符串输入参数。
再次回忆一下描述:“使用正则表达式定义的定界符将字符串拆分为子字符串。” regex输入参数是应用于原始字符串的正则表达式。当字符或字符组合匹配时,它们被视为分隔符。

Java在实践中的分裂
现在让我们更接近这一点。假设我们有一串单词。例如,像这样:
我爱爪哇
我们需要将字符串拆分成单词。我们看到这个字符串中的单词之间用空格隔开。在这种情况下,空格字符是我们分隔符的完美候选者。解决我们任务的代码如下所示:
public class Main {
public static void main(String[] args) {
String str = "I love Java";
String[] words = str.split(" ");
for (String word : words) {
System.out.println(word);
}
}
}
main方法 的输出将是以下几行:
我爱爪哇
让我们再看几个split方法如何工作的例子:
细绳 | 定界符 | 方法的结果 |
“我爱爪哇” | " "(空格字符) | { “我”,“爱”,“Java” } |
“192.168.0.1:8080” | “:” | { "192.168.0.1" , "8080" } |
“红、橙、黄” | "," | { “红色” , “橙色” , “黄色” } |
“红、橙、黄” | ", " | { “红色” , “橙色” , “黄色” } |
前导分隔符
这是另一个重要的细微差别。如果原始字符串以分隔符开头,则结果数组的第一个元素将为空字符串。例如,它看起来像这样: 原始字符串:" I love Java" 分隔符:" " 结果数组:{ "", "I", "love", "Java" } 但如果原始字符串以分隔符结尾而不是以一个开头,则结果将不同:原始字符串:“我爱 Java” 分隔符:“” 结果数组:{“我”,“爱”,“Java”public class Main {
public static void main(String[] args) {
print("I love Java".split(" "));
print(" I love Java".split(" "));
print("I love Java ".split(" "));
print(" I love Java ".split(" "));
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
主要方法的输出将是这样的:
[我,爱,Java] [,我,爱,Java] [,我,爱,Java] [,我,爱,Java]
再次将注意力转向以下事实:当原始字符串中的第一个字符是分隔符时,结果是数组中的第一个元素将是一个空字符串。
超载兄弟姐妹
String类有另一个具有以下签名的 split方法:String[] split(String regex, int limit)
此方法有一个额外的限制参数:它确定将正则表达式模式应用于原始字符串的次数。请参阅以下说明:
极限 > 0
该模式应用限制-1 次。更重要的是,返回的数组的长度不会超过limit参数的值。数组的最后一个元素将是字符串中最后一个找到分隔符的位置之后的部分。例子:public class Main {
public static void main(String[] args) {
print("I love Java".split(" ", 1));
print("I love Java".split(" ", 2));
/*
Output:
[I love Java]
[I, love Java]
*/
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
限制 < 0
定界符正则表达式将尽可能多地应用于字符串。结果数组可以有任何长度。例子:public class Main {
public static void main(String[] args) {
// Note the space at the end of the string
print("I love Java ".split(" ", -1));
print("I love Java ".split(" ", -2));
print("I love Java ".split(" ", -12));
/*
Output:
[I, love, Java, ]
[I, love, Java, ]
[I, love, Java, ]
Please note that the last element of the array is
an empty string. This is caused by the whitespace
at the end of the original string.
*/
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
限制 = 0
与limit < 0的情况一样,分隔符模式将尽可能多地应用于字符串。最终数组可以有任何长度。如果最后一个元素是空字符串,它们将从最终数组中丢弃。例子:public class Main {
public static void main(String[] args) {
// Note the space at the end of the string
print("I love Java ".split(" ", 0));
print("I love Java ".split(" ", 0));
print("I love Java ".split(" ", 0));
/*
Output:
[I, love, Java]
[I, love, Java]
[I, love, Java]
Note the absence of empty strings at the end of the arrays
*/
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
如果我们看一下split方法 的单参数版本的实现,那么我们可以看到它就像它的重载兄弟,但第二个参数设置为零:
public String[] split(String regex) {
return split(regex, 0);
}
各种例子
在现实世界的实践中,有时会发生我们有根据某些规则生成的字符串。这样的字符串可能从任何地方进入我们的程序:- 来自第三方服务;
- 来自发送到我们服务器的请求;
- 来自配置文件;
- 等等。
user_id|user_login|user_email
我们以一些具体的值为例:
135|本德尔|bender@gmail.com
假设程序员的任务是编写一个向用户发送电子邮件的方法。程序员可以访问以上述格式记录的用户数据。我们现在将继续分析的子任务是如何将电子邮件地址与其余用户数据隔离开来。这是split方法有用的一个实例。毕竟,如果我们查看用户数据模板,就会意识到从其余部分中提取用户的电子邮件地址很简单,只需调用 split 方法来拆分字符串即可。然后电子邮件地址将位于结果数组的最后一个元素中。下面是一个方法示例,该方法采用包含用户数据的字符串并返回用户的电子邮件地址。为简单起见,假设数据字符串始终采用我们想要的格式:
public class Main {
public static void main(String[] args) {
String userInfo = "135|bender|bender@gmail.com";
System.out.println(getUserEmail(userInfo));
// Output: bender@gmail.com
}
static String getUserEmail(String userInfo) {
String[] data = userInfo.split("\\|");
return data[2]; // or data[data.length - 1]
}
}
注意分隔符:“\\|” . 在正则表达式中,“|” 是一个具有特殊含义的特殊字符,所以如果我们想用它作为普通字符(即我们想在原始字符串中查找的内容),那么我们需要用两个反斜杠对字符进行转义。考虑另一个例子。假设我们有结构如下的订单信息:
item_number_1,item_name_1,item_price_1;item_number_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_n
或者我们甚至可以采用一些特定的值:
1、黄瓜2.39;2、西红柿1.89;3、培根4.99
我们的任务是计算订单的总成本。在这里,我们将不得不多次应用split方法。第一步是使用“;”分割字符串 作为分隔符,以便将其分解成其组成部分。然后每个结果子字符串将包含有关单独产品的信息,我们可以稍后处理这些信息。然后,对于每个产品,我们将使用“,”符号拆分相应的信息。我们将从生成的字符串数组中获取具有特定索引(存储产品价格的索引)的元素,将其转换为数字形式,并计算订单的总成本。让我们编写一个方法来完成所有这些计算:
public class Main {
public static void main(String[] args) {
String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
System.out.println(getTotalOrderAmount(orderInfo));
// Output: 9.27
}
static double getTotalOrderAmount(String orderInfo) {
double totalAmount = 0d;
final String[] items = orderInfo.split(";");
for (String item : items) {
final String[] itemInfo = item.split(",");
totalAmount += Double.parseDouble(itemInfo[2]);
}
return totalAmount;
}
}
看看你是否能自己弄清楚这个方法是如何工作的。基于这些示例,我们可以说当我们将一些数据格式化为字符串时使用split方法,我们需要从中提取某些更具体的信息。概括
我们检查了String类的split方法。当您必须借助特殊定界符将字符串拆分为其组成部分时,这正是您所需要的。该方法返回一个字符串数组(组成原始字符串的子字符串)。它接受一个正则表达式,其匹配代表分隔符。我们检查了这种方法的各种微妙之处:- 前导分隔符;
- 它的重载兄弟有两个参数。
GO TO FULL VERSION