Java Split не работает должным образом - PullRequest
6 голосов
/ 07 июня 2010

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

Ответы [ 4 ]

9 голосов
/ 07 июня 2010

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

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

3 голосов
/ 07 июня 2010

для вашего примера, вы можете просто сделать это:

String s = "00-00000";

String pattern = "-";

String[] parts = s.split(pattern);
1 голос
/ 07 июня 2010

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

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 голос
/ 07 июня 2010

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

    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);
            }
         }
    }
...