Захват групп с помощью регулярного выражения If тогда еще в Java - PullRequest
1 голос
/ 31 января 2012

У меня есть строка ввода в следующем формате

String input = "00IG356001110002005064007000000";

Символы 3-7 - это код.

Количество символов 8-12.

На основе кода во входной строке (IG356 в строке ввода примера) мне нужно захватить сумму (00111 в примере). Значение в сумме (символы 8-12) следует подбирать только для конкретных кодов, а логика описана ниже.

  1. Код не должен быть SG356. Если это SG356, не совпадение и выход.
  2. а. Если код не является SG356, проверьте, являются ли коды IG902 или SG350, в этом случае введите сумму (00111)

    еще

    б. Проверьте наличие 3 цифр в коде (символы 5-7, 356 в этом примере). Если они 200,201,356,370. идти вперед и получить сумму

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

String regex= ".{2}(?!SG356)((?=IG902|SG350).{5}(.{5}).+|.{2}(?=200|201|356|370).{3}(.{5}).+)";

Регулярное выражение работает нормально, если код во входной строке - IG902 или SG350 (когда часть регулярного выражения 'if' совпадает). но если «другое» совпадает, я не могу получить сумму.

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

.{2}(?!SG356)((?=IG902|SG350).+|.{2}(?=200|201|356|370).+) 

Проблема только во время захвата группы. Я запускаю это на Java. Любая помощь будет принята с благодарностью.

Я использую код Java:

public String getTsqlSum(String input, String regex){
     String value = null;
     Matcher m = Pattern.compile(regex).matcher(input);
     System.out.println("Group Count: " + m.groupCount());
     if (m.matches()) {
    for (int i=0;i<m.groupCount();i++){
        System.out.println("For i: " + i +" Value: " + m.group(i));
         }
     }
     return value;
}

public void forumTest(){
    //String input = "00IG902001110002005064007000000";
         String input = "00IG356001110002005064007000000";
    String regex= ".{2}(?!SG356)(?:(?=IG902|SG350).{5}|.{2}(?=200|201|356|370).{3})(.{5}).+";
    System.out.println(match(input, regex));
    String match = getTsqlSum(input, regex);
    System.out.println("Match: " + match);
}

1 Ответ

2 голосов
/ 31 января 2012

Регулярное выражение работает нормально, если код во входной строке - IG902 или SG350 (когда часть регулярного выражения 'if' совпадает). но если «другое» совпадает, я не могу получить сумму.

Вы не можете получить сумму, выражение работает нормально. Но если вы находитесь во второй части чередования (это не регулярное выражение if-then-else), тогда ваш результат находится в другой группе захвата. Вы найдете его в группе захвата 3 , а не во второй, как в случае совпадения в первой части чередования.

String regex= ".{2}(?!SG356)((?=IG902|SG350).{5}(.{5}).+|.{2}(?=200|201|356|370).{3}(.{5}).+)";
        Group number        1                   2                                   3

В регулярном выражении группы захвата нумеруются их открывающими скобками, и это продолжается также поочередно. В Perl была бы конструкция, которая дает группам захвата чередования одинаковое число, но я думаю, что это единственная возможность, которая способна сделать это.

В Java вам нужно проверить после выражения, в какой группе у вас есть результат.

Смотрите мой ответ здесь , похожая тема

Вы можете изменить свое регулярное выражение и сделать чередование перед группой захвата

попробуйте это

.{2}(?!SG356)(?:(?=IG902|SG350).{5}|.{2}(?=200|201|356|370).{3})(.{5}).+

Вы найдете ваш результат в обоих случаях в группе 1. (Я сделал первый в группе без захвата, используя ?:)

Обновление после добавления источника

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

В группе m.group(0) вы найдете всю совпадающую строку.

Попробуйте это

for (int i=1;i<=m.groupCount();i++){
    System.out.println("For i: " + i +" Value: " + m.group(i));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...