Я пытаюсь использовать простое разделение для разбивания следующей строки: 00-00000
Мое выражение: ^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])
И мое использование:
String s = "00-00000";
String pattern = "^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])";
String[] parts = s.split(pattern);
Если я играю вокруг с классами Pattern и Matcher I, видят, что мой шаблон действительно соответствует, и matcher говорит мне, что мой groupCount равняется 7, который корректен. Но когда я пытаюсь разделить их, у меня нет удачи.
Я не могу быть уверен, но думаю, что вы пытаетесь получить каждую совпадающую группу в массив.
Matcher matcher = Pattern.compile(pattern).matcher();
if (matcher.matches()) {
String s[] = new String[matcher.groupCount()) {
for (int i=0;i<matches.groupCount();i++) {
s[i] = matcher.group(i);
}
}
}
для вашего примера вы можете просто сделать следующее:
String s = "00-00000";
String pattern = "-";
String[] parts = s.split(pattern);
String.split не использует группы захвата в качестве своего результата. Он находит все, что соответствует, и использует это в качестве разделителя. Таким образом, результирующая строка String [] - это подстроки между тем, что соответствует регулярному выражению. Поскольку это регулярное выражение соответствует всей строке, и со всей строкой в качестве разделителя больше ничего не остается, поэтому он возвращает пустой массив.
Если вы хотите использовать группы захвата регулярных выражений , вам придется использовать Matcher.group () , String.split () не будет работать.
Из документации:
String [] split (String regex)
- Возвращает: массив строк, вычисленный путем разбиения этой строки на совпадения данное регулярное выражение
По сути, регулярное выражение используется для определения разделителей во входной строке. Вы можете использовать группы захвата и обратные ссылки в своем шаблоне (например, для поиска), но в конечном итоге важно то, что и где совпадает с шаблоном, потому что это определяет, что входит в возвращаемый массив.
Если вы хотите разделить исходную строку на 7 частей с помощью регулярного выражения, вы можете сделать что-то вроде этого:
String s = "12-3456";
String[] parts = s.split("(?!^)");
System.out.println(parts.length); // prints "7"
for (String part : parts) {
System.out.println("Part [" + part + "]");
} // prints "[1] [2] [-] [3] [4] [5] [6] "
Это разбивается на утверждение сопоставления нулевой длины (?! ^)
, которое находится где угодно, кроме первого символа в строке. Это не позволяет пустой строке быть первым элементом в массиве, а завершающая пустая строка уже отбрасывается, потому что мы используем параметр limit
по умолчанию для split
.
Однако использование регулярного выражения для получения отдельного символа такой строки является излишним. Если у вас всего несколько символов, наиболее кратким вариантом будет использование foreach
в toCharArray ()
:
for (char ch : "12-3456".toCharArray()) {
System.out.print("[" + ch + "] ");
}
Это не самый эффективный вариант, если у вас более длинный нить.
-
Это также может быть то, что вы ищете:
String s = "12-3456";
String[] parts = s.split("-");
System.out.println(parts.length); // prints "2"
for (String part : parts) {
System.out.print("[" + part + "] ");
} // prints "[12] [3456] "