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