Извлечь строку между множеством ограничителей с группами - PullRequest
1 голос
/ 08 апреля 2019

Как видно из заголовка, у меня есть строка, и я хочу извлечь из нее некоторые данные.

Это моя строка:

text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";

, и я хочу извлечь все данныемежду трубами: tab_PRO, 1, 1 ... и так далее.Я пробовал:

Pattern p = Pattern.compile("\\|(.*?)\\|");
    Matcher m = p.matcher(text);
    while(m.find())
    {
        for(int i = 1; i< 10; i++) {
        test = m.group(i); 
        System.out.println(test);
        }
    }

и с этим я получаю первую группу это tab_PRO.Но я также получаю сообщение об ошибке

java.lang.IndexOutOfBoundsException: нет группы 2

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

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 08 апреля 2019

Использование String.split(). Примите во внимание, что он ожидает регулярное выражение в качестве аргумента, а | является зарезервированным операндом регулярного выражения, поэтому вам нужно экранировать его с помощью \. Итак, сделайте это двумя \, чтобы \| не интерпретировалось, как если бы вы использовали - недопустимую - escape-последовательность для символа |:

String[] parts = text.split("\\|");

Посмотрите, как это работает здесь: https://ideone.com/WibjUm

Если вы хотите использовать свой подход к регулярным выражениям, вам нужно будет группировать и фиксировать каждое повторение символов после каждого | и ограничивать их любым, кроме |, возможно, используя регулярное выражение, например \\|([^\\|]*).

В вашем цикле вы перебираете m.find() и просто используете группу захвата 1, потому что это единственная группа, которая будет иметь каждое совпадение.

String text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";
Pattern p = Pattern.compile("\\|([^\\|]*)");
Matcher m = p.matcher(text);
while(m.find()){
    System.out.println(m.group(1));
}

https://ideone.com/RNjZRQ

1 голос
/ 08 апреля 2019

Попробуйте использовать .split() или .substring()

0 голосов
/ 08 апреля 2019

Как уже упоминалось в комментариях, это легче сделать с помощью String.split.

Что касается вашего собственного кода, вы без необходимости используете внутренний цикл, и это приводит к этому исключению. У вас есть только одна группа, но цикл for заставит вас запросить более одной группы. Ваш цикл должен быть таким простым:

Pattern p = Pattern.compile("(?<=\\|)(.*?)\\|");
Matcher m = p.matcher(text);
while (m.find()) {
    String test = m.group(1);
    System.out.println(test);
}

И это печатает

tab_PRO
1
1
#tRecordType#

0
tab_PRO

Обратите внимание, что мне пришлось использовать в своем регулярном выражении утверждение с опозданием.

...