( Отказ от ответственности : заголовок этого вопроса, вероятно, слишком общий и бесполезный для будущих читателей, имеющих такую же проблему. Возможно, только потому, что я не могу сформулировать это правильно, я не был Я могу найти что-нибудь еще, чтобы решить мою проблему ... Я занимаюсь изменением названия или просто закрываю вопрос, как только кто-нибудь поможет мне выяснить, в чем реальная проблема :)).
Описание высокого уровня
Я получаю строку ввода, которая содержит две интересующие меня информации:
- Имя версии, которое
3.1.build
и еще что-нибудь позже
- Идентификатор сборки, который
somenumbers-somenumbers-eitherwordsornumbers-somenumbers
Мне нужно извлечь их отдельно.
Подробнее о входах
У меня есть вход, который может поступать 4 разными способами:
Образец 1 : v3.1.build.dev.12345.team 12345-12345-cici-12345
(пробелы между ними сначала равны \t
, а затем пробелами).
Образец 2 : v3.1.build.dev.12345.team 12345-12345-12345-12345
(это очень похоже на первый пример, за исключением того, что во второй части у нас есть только цифры и -
, без буквенных символов).
Образец 3 :
v3.1.build.dev.12345.team
12345-12345-cici-12345
(приведенное выше очень похоже на пример 1, за исключением того, что вместо \t
и пробелов есть просто новая строка.
Образец 4 :
v3.1.build.dev.12345.team
12345-12345-12345-12345
(то же, что и выше, только цифры и тире во второй строке).
Обратите внимание, что в образце 3 и образце 4 после обеих строк есть некоторые пробелы (здесь не видно).
Подводя итог, это 4 возможных входа:
String str1 = "v3.1.build.dev.12345.team\t\t\t\t\t 12345-12345-cici-12345";
String str2 = "v3.1.build.dev.12345.team\t\t\t\t\t 12345-12345-12345-12345";
String str3 = "v3.1.build.dev.12345.team \n12345-12345-cici-12345 ";
String str4 = "v3.1.build.dev.12345.team \n12345-12345-12345-12345 ";
Мой код сейчас
Я написал следующий код для извлечения необходимой мне информации (здесь сообщается только о релевантной информации, перейдите по ссылке fiddle , чтобы получить полный и работоспособный пример):
String versionPattern = "^.+[\\s]";
String buildIdPattern = "[\\s].+";
Pattern pVersion = Pattern.compile(versionPattern);
Pattern pBuildId = Pattern.compile(buildIdPattern);
for (String str : possibilities) {
Matcher mVersion = pVersion.matcher(str);
Matcher mBuildId = pBuildId.matcher(str);
while(mVersion.find()) {
System.out.println("Version found: \"" + mVersion.group(0).replaceAll("\\s", "") + "\"");
}
while (mBuildId.find()) {
System.out.println("Build-id found: \"" + mBuildId.group(0).replaceAll("\\s", "") + "\"");
}
}
Проблема, с которой я сталкиваюсь
Приведенный выше код работает, в значительной степени. Однако в Примере 3 и Примере 4 (те, где идентификатор сборки отделен версией с \n
), я получаю два совпадения: первое - просто ""
, второе - это одно Хотелось бы.
Я не чувствую, что этот код стабилен, и я думаю, что что-то не так с шаблоном регулярных выражений для соответствия идентификатору сборки:
String buildIdPattern = "[\\s].+";
Есть ли у кого-нибудь идеи, чтобы исключить первое пустое совпадение в идентификаторе сборки для примеров 3 и 4 при сохранении всех остальных совпадений?
Или какой-нибудь лучший способ написать регулярные выражения (я открыт для улучшений, не большой эксперт по регулярным выражениям)?