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("-"));
// prints "[a][b][c][d]"
dump(text.split("-", 2));
// prints "[a][b-c-d---]"
dump(text.split("-", -1));
// [a][b][c][d][][][]
}
Раздел, которыйсохраняет разделитель
Если вам нужна функция, аналогичная разделу, и вы также хотите получить строку разделителя, которая соответствует произвольному шаблону, вы можете использовать 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+"));
// prints "[james][007][bond111]"
}
Регулярное выражение \d+
, конечно, любоесимвол цифры (\d
) повторяется один или несколько раз (+
).