Моя логика не всегда работает, потому что я пропускаю некоторый параметр регулярного выражения, чтобы игнорировать случаи и обрабатывать 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*/
Возможно, вы захотите отформатировать этот код, чтобы его можно было прочитать. – tanenbring
Извините, я просто сделал это. –
ужасное форматирование .. Я пытался отредактировать, но сдался. – Philo