正则表达式 - 小写和空格问题

时间:2016-01-26 19:08:48

标签: java regex

我的逻辑并不总是有效,因为我错过了一些正则表达式参数以便忽略这些情况并将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*/

1 个答案:

答案 0 :(得分:1)

要忽略等号周围的空格,请使用\s*=\s*或作为Java字符串"\\s*=\\s*"。另请注意,您的模式中的任何空白区域都会计算,即,如果您编写了" b"这实际上意味着字母a,空格,字母b。如果你想忽略空格,可以用空格写一个量词(" a * b"表示字母a,零到多个空格,字母b)或使用\s代表空格(空格,制表符......)和量词。

要不区分大小写,请将CASE_INSENSITIVE标记传递给Pattern.compile