【问题标题】:Java Regex decoding treating multiple delimiters as same not workingJava Regex解码将多个分隔符视为相同不起作用
【发布时间】:2020-03-07 18:27:31
【问题描述】:

谢谢你的帮助,

我正在尝试获取一个正则表达式来解码带有逗号或分号作为锚点的字符串,但我似乎无法让它适用于逗号或两者。请告诉我我错过了什么或做错了什么。谢谢!

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

【问题讨论】:

  • 你是这个意思吗? ^(?&lt;FADECID&gt;\d{6})(?&lt;MSG&gt;([a-zA-Z0-9() -]*([;,]))+)?(?&lt;ANCH&gt;\w*\4)?(?&lt;TIME&gt;\d{4})?(?&lt;FM&gt;\d{2})?\4?(?&lt;CON&gt;.*)$regex101.com/r/RYb92S/1
  • 请编辑以显示您的示例所需的结果。当你举一个例子时,你应该总是这样做。
  • 请注意@Thefourthbird 已正确删除'?'在(?&lt;FADECID&gt;\d{6})? 的末尾。如果出现问号并且“我的狗有跳蚤”添加到字符串的开头,则捕获组FACECID 中不会捕获任何内容,MSG 捕获组中将捕获以下内容:"My dog has fleas 383154VSC...(135MG;35MG)" .
  • 如果你提供一些java代码,其他人会更容易重现问题。
  • 谢谢!嘿,那 \4 是如何工作的?我以前没有用过或见过。谢谢!

标签: java regex regex-group


【解决方案1】:

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

在这种情况下,捕获组是([;,]),这是用\4 表示的第四组,匹配;,

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

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

说明

  • ^ 字符串开始
  • (?&lt;FADECID&gt;\d{6}) 命名组FADECID,匹配6位数字
  • (?&lt;MSG&gt; 命名组MSG
    • ( 捕获第 3 组
      • [a-zA-Z0-9() -]* 匹配任何列表的 0+ 次
      • ([;,])捕获group 4,用作反向引用以获得一致的分隔符
    • ){7,} 关闭小组并重复 7 次以上
  • )关闭群MSG
  • (?&lt;TIME&gt;\d{4})?可选命名组TIME,匹配4位数字
  • (?&lt;FM&gt;\d{2})?可选命名组FM,匹配2位数字
  • \4? 捕获组 4 的可选反向引用
  • (?&lt;CON&gt;.*) 命名组 CON 匹配除换行符以外的任何字符 0+ 次
  • $字符串结束

Regex demo

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

【讨论】:

  • 谢谢!赞赏!我喜欢后面的参考资料,感谢您的解释和帮助。很棒。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多