Java 将多个定界符视为相同的正则表达式解码不起作用

Java Regex decoding treating multiple delimiters as same not working

感谢您的帮助,

我正在尝试使用正则表达式来解码以逗号或分号作为锚点的字符串,但我似乎无法让它对逗号或两者都起作用。请告诉我我遗漏了什么或做错了什么。谢谢!

^(?<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;

这管理 - (?([a-z A-Z 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 组的所有情况,如果存在 TIME 和 FM。

您可以使用捕获组和 backreference 使用该组的编号来获得一致的分隔符。

在这种情况下,捕获组是 ([;,]),这是由 </code> 表示的第四组,匹配 <code>;,

如果你只需要 组 2 并且如果 TIME 和 FM 你可以省略组 ANCH

^(?<FADECID>\d{6})(?<MSG>([a-zA-Z0-9() -]*([;,])){7,})(?<TIME>\d{4})?(?<FM>\d{2})??(?<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 的可选反向引用
  • (?<CON>.*) 命名组 CON 匹配除换行符以外的任何字符 0+ 次
  • $ 字符串结束

Regex demo

请注意,第 3 组捕获组本身是重复的,为您提供迭代的最后一个值,即 HARD