繁体   English   中英

Java Regex 解码将多个分隔符视为相同不起作用

[英]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;

这管理 - (?([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,如果 TIME 和 FM 存在。

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

在这种情况下,捕获组是([;,]) ,这是由\\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+ 次
  • $字符串结尾

正则表达式演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM