Регулярное выражение работает нормально, если код во входной строке - 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));
}