Java Декодирование Regex, рассматривая множественные разделители как одинаковые не работающие - PullRequest
0 голосов
/ 07 марта 2020

enter image description here и спасибо за вашу помощь,

Я пытаюсь получить выражение регулярного выражения для декодирования строки с запятой или точкой с запятой в качестве якоря, но я не могу Кажется, он не работает для запятой или для обоих. Пожалуйста, скажите мне, что я пропускаю или делаю неправильно. спасибо!

^(?<FADECID>\d{6})?(?<MSG>([a-z A-Z 0-9 ()-:]*[;,]{1}+){8,}+)?(?<ANCH>\w*[;,])?(?<TIME>\d{4})?(?<FM>\d{2})?[;,]?(?<CON>.*)$.*

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

383154VSC    X1;;;;;;;BOTH WASTE DRAIN VLV    NOT CLSD (135MG;35MG);HARD;093502
282151FCMC1  1;;;;;;;FUEL MAIN PUMP1 (121QA1);HARD;093502
732112EEC2B  1;;;;;;;FMU(E2-4071KS)WRG:EEC  J12 TO FMV LVDT POS,HARD;
383154VSC    X1,,,,,,,BOTH WASTE DRAIN VLV    NOT CLSD (135MG,35MG),HARD,093502
282151FCMC1  1,,,,,,,FUEL MAIN PUMP1 (121QA1);HARD;093502
732112EEC2B  1,,,,,,,FMU(E2-4071KS)WRG:EEC  J12 TO FMV LVDT POS,HARD,
383154VSC    X1,,,,,,,BOTH WASTE DRAIN VLV    NOT CLSD (135MG;35MG);HARD;093502
282151FCMC1  1;;;;;;;FUEL MAIN PUMP1 (121QA1),HARD,093502
732112EEC2B  1,,,,,,,FMU(E2-4071KS)WRG:EEC  J12 TO FMV LVDT POS;HARD;

Эта строка может содержать несколько текстов [;, ] отдельные сообщения.

ABC;DEF;;HIJ;NNN;JJJ;XXX;EEX;HARD;

Это позволяет это - (? ([Az AZ 0-9 () -:] * [;,] {1} +) {8,} +)? но он не видит запятые?

Это работает для; но не для запятой или для обоих, моя проблема в том, что это может быть как точка с запятой, так и запятая? если я делаю запятую только для регулярных выражений, она работает для строк с запятыми, я знаю, что пропускаю квантификатор или что-то в этом роде.

                            if ( null != MORE && ! MORE.isEmpty() ) {

                                while ( null != MORE && ! MORE.isEmpty() || MORE.trim().equals("EOR")) {

                                    LOG.info("MORE CONTINUE: " + MORE);
                                    if ( MORE.trim().equals("EOR") ) {
                                        break;
                                    }
                                    String patternMoreString = "^(?<FADECID>\\d{6})?(?<MSG>([a-z A-Z 0-9 ()-:()]*[;,]{1}+){8,}+)+?(?<ANCH>\\w*[;,])?(?<TIME>\\d{4})?(?<FM>\\d{2})?[;,]?(?<CON>.*)$.*";
                                    Pattern patternMore = Pattern.compile(patternMoreString, Pattern.DOTALL);
                                    Matcher matcherMore = patternMore.matcher(MORE);

                                    while ( matcherMore.find() ) {

                                        MORE = matcherMore.group("CON");

                                        summary.setReportId("FLR");
                                        summary.setAreg(Areg);
                                        summary.setShip(Ship);
                                        summary.setOrig(Orig);
                                        summary.setDest(Dest);
                                        summary.setTimestamp(Ts);
                                        summary.setAta(matcherMore.group("FADECID"));
                                        summary.setTime(matcherMore.group("TIME"));
                                        summary.setFm(matcherMore.group("FM"));
                                        summary.setMsg(matcherMore.group("MSG"));

                                        serviceRecords.add(summary);

                                        LOG.info("*** A330 MPF MORE Record ***");
                                        LOG.info(summary.getReportId());
                                        LOG.info(summary.getAreg());
                                        LOG.info(summary.getShip());
                                        LOG.info(summary.getOrig());
                                        LOG.info(summary.getDest());
                                        LOG.info(summary.getTimestamp());
                                        LOG.info(summary.getAta());
                                        LOG.info(summary.getTime());
                                        LOG.info(summary.getFm());
                                        LOG.info(summary.getMsg());

                                        summary = new A330PostFlightReportRecord();
                                    }
                                }
                            }
                        }
                        //---

Мне нужно для всех дел группа 2 и если существуют ВРЕМЯ и ЧМ.

1 Ответ

1 голос
/ 10 марта 2020

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

В этом случае группа захвата равна ([;,]), которая является четвертая группа, обозначенная \4, которая соответствует ; или ,

Если вам нужна только группа 2 и если TIME и FM , вы можете опустить группу ANCH

^(?<FADECID>\d{6})(?<MSG>([a-zA-Z0-9() -]*([;,])){7,})(?<TIME>\d{4})?(?<FM>\d{2})?\4?(?<CON>.*)$

Пояснение

  • ^ Начало строки
  • (?<FADECID>\d{6}) Именованная группа FADECID, соответствует 6 цифрам
  • (?<MSG> Именованная группа MSG
    • ( Захват Группа 3
      • [a-zA-Z0-9() -]* Совпадение 0+ раз с любым из списков
      • ([;,]) Захват группа 4 , используемая в качестве обратной ссылки для получения согласованных разделителей
    • ){7,} Закрыть группу и повторить 7+ раз
  • ) Закрыть группу MSG
  • (?<TIME>\d{4})? Необязательная именованная группа TIME, соответствует 4 цифрам
  • (?<FM>\d{2})? Необязательная именованная группа FM , соответствует 2 цифрам
  • \4? Дополнительная обратная ссылка для захвата группы 4
  • (?<CON>.*) Именованная группа CON Соответствует любому символу, кроме новой строки 0+ раз
  • $ Конец строки

Regex demo

Обратите внимание, что группа 3 сама группа захвата повторяется, давая вам последнее значение итерации, которое будет HARD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...