Разделение Java, не работающее как ожидалось

Я пытаюсь использовать простое разделение для разбивания следующей строки: 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, который корректен. Но когда я пытаюсь разделить их, у меня нет удачи.

6
задан nhahtdh 12 January 2014 в 08:15
поделиться

4 ответа

Я не могу быть уверен, но думаю, что вы пытаетесь получить каждую совпадающую группу в массив.

    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);
            }
         }
    }
1
ответ дан 8 December 2019 в 17:18
поделиться

для вашего примера вы можете просто сделать следующее:

String s = "00-00000";

String pattern = "-";

String[] parts = s.split(pattern);
3
ответ дан 8 December 2019 в 17:18
поделиться

String.split не использует группы захвата в качестве своего результата. Он находит все, что соответствует, и использует это в качестве разделителя. Таким образом, результирующая строка String [] - это подстроки между тем, что соответствует регулярному выражению. Поскольку это регулярное выражение соответствует всей строке, и со всей строкой в ​​качестве разделителя больше ничего не остается, поэтому он возвращает пустой массив.

Если вы хотите использовать группы захвата регулярных выражений , вам придется использовать Matcher.group () , String.split () не будет работать.

9
ответ дан 8 December 2019 в 17:18
поделиться

Из документации:

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] "
1
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: