gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:54:21 24 4
gpt4 key购买 nike

enter image description here并感谢您的帮助,

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

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

如果 TIME 和 FM 存在,我需要第 2 组的所有案例。

最佳答案

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

在本例中,捕获组为 ([;,])这是由 \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

关于Java 正则表达式解码将多个分隔符视为相同不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60580872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com