2016-01-26 4 views
-1

Моя логика не всегда работает, потому что я пропускаю некоторый параметр регулярного выражения, чтобы игнорировать случаи и обрабатывать 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 Покупка ПДС 158 SF 4 = BB DE 26 = 4511» Выходные значения strTagDes = «de003 (de003 = 00) -de026 (de026 = 4511) - « strTagPdss =„pds0158 (pds0158pdss4 = ВВ) -“

2 Сценарий: входное значение wholeLine = (не работает, как ожидалось Примечание SF в нижнем регистре.)«DE 3 = 00 Покупка PDS 158 sf 4 = BB DE 26 = 4511 " Выходные значения strTagDes =" de003 (de003 = 00) -de026 (de026 = 4511) - " st rTagPdss = ""

3 Сценарий (не работает должным образом. Обратите внимание, что нет пространства между DE и 26): входного значения wholeLine = «DE 3 = 00 Покупкой ПДС 158 SF 4 = BB DE26 = 4511» Выходных значений strTagDes = «de003 (de003 = 00) -» strTagPdss = «pds0158 (pds0158pdss4 = ВВ) -»

4 сценария (работает, как ожидалось): входное значение wholeLine = «PDS 0017 = U0» Выходные значения strTagDes = «» strTagPdss = «pds0017 (pds0017 = U0) - «

5 Сценарий (не работает должным образом). Обратите внимание, что нет места между 0017 и «сигнал =»): входного значение wholeLine = „PDS 0017 = U0“ значение Выходных strTagDes = „“ strTagPdss = „“

6 Сценария (не работает должным образом. Обратите внимание, есть два пробела между "=" сигналом и U0): входного значением wholeLine = «ПДС 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*/ 
+2

Возможно, вы захотите отформатировать этот код, чтобы его можно было прочитать. – tanenbring

+0

Извините, я просто сделал это. –

+1

ужасное форматирование .. Я пытался отредактировать, но сдался. – Philo

ответ

1

для игнорирования пространств вокруг знака равенства, используйте \s*=\s* или, как Java String "\\s*=\\s*". Также обратите внимание, что любое пробел в вашем шаблоне считается, т. Е. Если вы пишете «a», что на самом деле означает букву a, пробел, букву b. Если вы хотите игнорировать пустое пространство, либо введите квантификатор с пробелом («a * b» означает букву a, от нуля до многих пробелов, буква b), либо используйте \s, который обозначает пробел (пробел, вкладка, ...) с квантором.

Чтобы не учитывать регистр-регистр, передайте флаг CASE_INSENSITIVE на номер Pattern.compile.

+0

Роберт, спасибо. Передав флаг CASE_INSENSITIVE в Pattern.compile, я исправил второй сценарий. Тем не менее, я все еще сталкиваюсь с проблемами с пробелами. Я попробовал Pattern.compile («PDS \\ d +» (SF \\ d +) * = \\ S * + "), и я предполагаю, что он должен быть близок к исправлению сценария 6, потому что теперь я получаю вывод strTagPdss =" pds0017 (pds0017 =) - «. Шаблон присваивает метку идентификатора (т. Е. Pds0017), но значение (т. Е. U0) теряется. Для сценария 3 я попытался добавить * после DE и для сценария 5 я попробовал добавить * после PDS \\ d, ничего не изменив на выходе. Я очень ограничен в RegEx. Если вам нужна дополнительная информация, сообщите мне об этом. –

+0

Роберт, ваши объяснения понятны и имеют для меня большой смысл, но я все еще застрял. Давайте рассмотрим проблему на простом примере: wholeLine = «DE3 = 00». Обратите внимание, что между DE и 3 нет пробела. Затем я пытаюсь в Pattern.compile: «DE * \\ d +,? (SF \\ d +) * = \\ S + "," DE * \\ * \\ d +,? (SF \\ d +) * = \\ S + "," DE * \\ s * \\ d +,? (SF \\ d +) * = \\ S + "," DE \\ s * \\ d +,? (SF \\ d +) * = \\ S + " –

Смежные вопросы