+
является метасимволом регулярных выражений повторения «один или более», поэтому шаблон -+
является «одним или несколькими тире».Это позволит вам использовать str.split("-+")
вместо этого, но вы можете получить пустую строку в качестве первого элемента.
Если вы просто хотите удалить все -
, тогда вы можете сделать str = str.replace("-", "")
.При этом используется метод replace(CharSequence, CharSequence)
, который выполняет буквальную замену String
, т. Е. Не шаблоны регулярных выражений.
Если вы хотите String[]
с каждой цифрой в своем собственном элементе, тогда это проще всего.сделать в два шага: сначала удалить все нецифровые символы, затем использовать утверждение нулевой длины, чтобы разделить все, что не является началом строки (?!^)
(чтобы предотвратить получение пустой строки в качестве первого элемента).Если вы хотите char[]
, то вы можете просто позвонить String.toCharArray()
Наконец, если строка может быть очень длинной, лучше использовать java.util.regex.Matcher
в цикле find()
для поиска цифры \d
или java.util.Scanner
с разделителем \D*
, т. Е. Последовательность (возможно, пустая) нецифровых чисел.Это не даст вам массив, но вы можете использовать цикл для заполнения List
(см. Effective Java 2nd Edition, пункт 25. Предпочитайте списки массивам ).
Ссылки
Snippets
Вот несколько примеров, иллюстрирующих вышеприведенные идеи:
System.out.println(java.util.Arrays.toString(
"---4--5-67--8-9---".split("-+")
));
// [, 4, 5, 67, 8, 9]
// note the empty string as first element
System.out.println(
"---4--5-67--8-9---".replace("-", "")
);
// 456789
System.out.println(java.util.Arrays.toString(
"abcdefg".toCharArray()
));
// [a, b, c, d, e, f, g]
В следующем примере сначала удаляются все не-цифры \D
, затемрасщепление везде, кроме начала строки (?!^)
, чтобы получить String[]
, каждый из которых содержит цифру:
System.out.println(java.util.Arrays.toString(
"@*#^$4@!#5ajs67>?<{8_(9SKJDH"
.replaceAll("\\D", "")
.split("(?!^)")
));
// [4, 5, 6, 7, 8, 9]
Для получения каждой цифры используется Scanner
, с \D*
в качестве разделителя.в качестве собственного токена, используя его для заполнения List<String>
:
List<String> digits = new ArrayList<String>();
String text = "(&*!@#123ask45{P:L6";
Scanner sc = new Scanner(text).useDelimiter("\\D*");
while (sc.hasNext()) {
digits.add(sc.next());
}
System.out.println(digits);
// [1, 2, 3, 4, 5, 6]
Типичные проблемы с split()
Вот некоторые распространенные проблемы новичков при работе с String.split
:
Занятие № 1: split
использует шаблон регулярного выражения
Это, вероятно, самая распространенная ошибка для начинающихпринять:
System.out.println(java.util.Arrays.toString(
"one|two|three".split("|")
));
// [, o, n, e, |, t, w, o, |, t, h, r, e, e]
System.out.println(java.util.Arrays.toString(
"not.like.this".split(".")
));
// []
Проблема здесь в том, что |
и .
являются метасимволами регулярных выражений, и поскольку они предназначены для буквального совпадения, их необходимо экранировать, указав обратную косую черту, которая, какстроковый литерал Java - "\\"
.
System.out.println(java.util.Arrays.toString(
"one|two|three".split("\\|")
));
// [one, two, three]
System.out.println(java.util.Arrays.toString(
"not.like.this".split("\\.")
));
// [not, like, this]
Занятие № 2: split
по умолчанию отбрасывает конечные пустые строки
Иногда желательно сохранить конечные пустые строки (которые отбрасываютсяпо умолчанию split
):
System.out.println(java.util.Arrays.toString(
"a;b;;d;;;g;;".split(";")
));
// [a, b, , d, , , g]
Обратите внимание, что есть места для «пропущенных» значений для c
, e
, f
, но не для h
и i
.Чтобы исправить это, вы можете использовать отрицательный аргумент limit
для String.split(String regex, int limit)
.
System.out.println(java.util.Arrays.toString(
"a;b;;d;;;g;;".split(";", -1)
));
// [a, b, , d, , , g, , ]
Вы также можете использовать положительный limit
из n применять шаблон не более n - 1 раз (т. е. в результате получается не более n элементов в массиве).
Соответствие нулевой ширины split
examples
Вот еще несколько примеров разбиения на конструкции соответствия нулевой ширины;это может использоваться для разделения строки, но также для сохранения «разделителей».
Простое разделение предложений с сохранением знаков пунктуации:
String str = "Really?Wow!This.Is.Awesome!";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[.!?])")
)); // prints "[Really?, Wow!, This., Is., Awesome!]"
Разделение длинной строки на части фиксированной длины с использованием \G
String str = "012345678901234567890";
System.out.println(java.util.Arrays.toString(
str.split("(?<=\\G.{4})")
)); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
Разделить перед заглавными буквами (кроме первой!)
System.out.println(java.util.Arrays.toString(
"OhMyGod".split("(?=(?!^)[A-Z])")
)); // prints "[Oh, My, God]"
В соответствующих вопросах ниже приведены различные примеры.
Ссылки
Смежные вопросы