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+ 次
$
字符串结束
请注意,第 3 组捕获组本身是重复的,为您提供迭代的最后一个值,即 HARD
我正在尝试使用正则表达式来解码以逗号或分号作为锚点的字符串,但我似乎无法让它对逗号或两者都起作用。请告诉我我遗漏了什么或做错了什么。谢谢!
^(?<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+ 次$
字符串结束
请注意,第 3 组捕获组本身是重复的,为您提供迭代的最后一个值,即 HARD