我的逻辑并不总是有效,因为我错过了一些正则表达式参数以便忽略这些情况并将2个空格或0个空格视为等号一侧的1个空格(例如“=”或“=”应该接受与“=”相同的规则。所有代码都在下面进行演示。基本上,上下文是我阅读由用户填写的电子表格,其中包含由数据元素(DE)和主数据集(PDS)组织的数据。所有都可以通过其值或子字段(SF)填充。因此,简而言之,我读取输入字符串,查找DE some_identity = some_value,或PDS some_identity = some_value或DE some_identity SF = some_value,然后忽略其余部分。它完美地工作除了两个问题:有时用户只是在电子表格中填充两个空格“”,其中预计只有一个“”。在其他情况下,用户以小写字母键入身份标签(例如,sf)。
1场景(按预期工作): 输入值 wholeLine =“DE 3 = 00购买PDS 158 SF 4 = BB DE 26 = 4511” 输出值 strTagDes =“de003(de003 = 00)-de026(de026 = 4511) - ” strTagPdss =“pds0158(pds0158pdss4 = BB) - ”
2场景(未按预期工作。注意sf为小写): 输入值 wholeLine =“DE 3 = 00购买PDS 158 sf 4 = BB DE 26 = 4511” 输出值 strTagDes =“de003(de003 = 00)-de026(de026 = 4511) - ” strTagPdss =“”
3场景(不按预期工作。注意DE和26之间没有空格): 输入值 wholeLine =“DE 3 = 00购买PDS 158 SF 4 = BB DE26 = 4511” 输出值 strTagDes =“de003(de003 = 00) - ” strTagPdss =“pds0158(pds0158pdss4 = BB) - ”
4场景(按预期工作): 输入值 wholeLine =“PDS 0017 = U0” 输出值 strTagDes =“” strTagPdss =“pds0017(pds0017 = U0) - ”
5场景(未按预期工作。请注意,0017和“=”信号之间没有空格): 输入值 wholeLine =“PDS 0017 = U0” 输出值 strTagDes =“” strTagPdss =“”
6场景(未按预期工作。注意“=”信号和U0之间有两个空格): 输入值 wholeLine =“PDS 0017 = U0” 输出值 strTagDes =“” strTagPdss =“”
Pattern patternDE = Pattern.compile("DE \\d+,?( SF \\d+)* = \\S+");
Matcher matcherDE = patternDE.matcher(wholeLine);
while (matcherDE.find()) {
String strDe = "";
String strDePdss = "";
String wholeThing = matcherDE.group();
String[] parts = wholeThing.split("=");
if (parts[0].toUpperCase().contains("SF")) { // subfield present
parts[0] = parts[0].replaceAll(",","");
String[] strValues = parts[0].trim().split(" ");
strDe = "de" + String.format("%03d",Integer.parseInt(strValues[1]));
String strPdss = "pdss" + strValues[3];
strDePdss = strDe + "(" + strDe
+ strPdss + "="
+ parts[1].trim() + ")-";
} else { // no subfield
String[] strValues = parts[0].split(" ");
strDe = "de" + String.format("%03d", Integer.parseInt(strValues[1]));
strDePdss = strDe + "(" + strDe + "=" + parts[1].trim()
+ ")-";
}
strTagDes = strTagDes + strDePdss;
}
Pattern patternPDS = Pattern.compile("PDS \\d+,?( SF \\d+)* = \\S+");
Matcher matcherPDS = patternPDS.matcher(wholeLine);
while (matcherPDS.find()) {
String strPds = "";
String strPdsPdss = "";
String wholeThing = matcherPDS.group();
String[] parts = wholeThing.split("=");
if (parts[0].toUpperCase().contains("SF")) { // subfield present
parts[0] = parts[0].replaceAll(",","");
String[] strValues = parts[0].trim().split(" ");
strPds = "pds" + String.format( "%04d",Integer.parseInt(strValues[1]));
String strPdss = "pdss" + strValues[3];
strPdsPdss = strPds + "(" + strPds
+ strPdss + "="
+ parts[1].trim() + ")-";
} else { // no subfield
String[] strValues = parts[0].split(" ");
strPds = "pds" + String.format( "%04d",Integer.parseInt(strValues[1]));
strPdsPdss = strPds + "(" + strPds
+ "=" + parts[1].trim()
+ ")-";
}
strTagPdss = strTagPdss + strPdsPdss;
}
/*find the output in strTagDes and strTagPdss variables*/
答案 0 :(得分:1)
要忽略等号周围的空格,请使用\s*=\s*
或作为Java字符串"\\s*=\\s*"
。另请注意,您的模式中的任何空白区域都会计算,即,如果您编写了" b"这实际上意味着字母a,空格,字母b。如果你想忽略空格,可以用空格写一个量词(" a * b"表示字母a,零到多个空格,字母b)或使用\s
代表空格(空格,制表符......)和量词。
要不区分大小写,请将CASE_INSENSITIVE标记传递给Pattern.compile
。