String.split(String regex, int limit)
方法与您想要的非常接近。从文档中可以看到:
limit
参数控制模式应用的次数,因此影响结果数组的长度。
- 如果限制
n
大于零,则模式最多将应用n-1
次,数组的长度不会超过n
,并且数组的最后一个条目将包含所有匹配的分隔符之后的输入。
- 如果
n
为非正数,则模式将尽可能地应用,并且数组可以具有任何长度。
- 如果
n
为零,则模式将尽可能地应用,数组可以具有任何长度,并且末尾的空字符串将被丢弃。
以下是一个示例,展示了这些差异(如在ideone.com上看到的):
static void dump(String[] ss) {
for (String s: ss) {
System.out.print("[" + s + "]");
}
System.out.println();
}
public static void main(String[] args) {
String text = "a-b-c-d---";
dump(text.split("-"));
dump(text.split("-", 2));
dump(text.split("-", -1));
}
保留分隔符的分割
如果您需要与分割类似的功能,并且还想获取与任意模式匹配的分隔符字符串,可以使用Matcher
,然后在适当的索引处使用substring
。
以下是一个示例(如在ideone.com上看到的那样):
static String[] partition(String s, String regex) {
Matcher m = Pattern.compile(regex).matcher(s);
if (m.find()) {
return new String[] {
s.substring(0, m.start()),
m.group(),
s.substring(m.end()),
};
} else {
throw new NoSuchElementException("Can't partition!");
}
}
public static void main(String[] args) {
dump(partition("james007bond111", "\\d+"));
}
正则表达式
\d+
当然是匹配任何数字字符(
\d
)重复一次或多次(
+
)。