Задать паттерн для строки
Просьба подсказать как можно добавить паттерн для парсера/метода для строки примеры:
List<String> list = new ArrayList();
list.add('0456-5-1-3-060323');
list.add('0370-10-2-3-020323-П');
list.add('0369-10-020423-П');
list.add('03.01.08');
Метод должен работать так, чтобы я на выходе мог получить лист только с индексами 0, 1, 2.
есть похожий парсер для строки '03.01.08'
public List<String> getCode(String document) {
Pattern pattern = Pattern.compile("([0-9]+(\\.[0-9]+)+)");
Matcher matcher = pattern.matcher(document);
List<String> codeList = new ArrayList<>();
while (matcher.find()) {
int size = matcher.group().length();
if (size > 3 && size != 10) {
codeList.add(matcher.group());
}
}
return codeList;
}
Ответы (1 шт):
Если нужно отфильтровать строки в списке, можно использовать String::matches как функци-предикат в потоке строк.
В простейшем случае формат может быть такой:
"\\d{4}(-\\d{1,2}){1,3}(-\\d{6})(-\\p{Lu})?"
- в начале строки 4 цифры;
- затем от 1 до 3 групп, начинающихся с минуса и содержащих 1 или 2 цифры;
- группа из минуса и 6 цифр ровно
- группа из минуса и любой заглавной буквы
Возможно, для отдельных групп цифр следует использовать дополнительные ограничения, типа проверки даты в ddmmyy формате, где дни должны быть в диапазоне 01-31, месяцы - 01-12 и т.п.
public static List<String> filterData(List<String> data) {
return data.stream()
.filter(s -> s.matches("\\d{4}(-\\d{1,2}){1,3}(-\\d{6})(-\\p{Lu})?"))
.collect(Collectors.toList());
}
Если нужно распарсить некую строку, содержащую данные в указанном формате, разделённые произвольными разделителями, можно применить паттерн и получить поток строк при помощи Matcher::results:
public static List<String> filterString(String str) {
return Pattern.compile("\\d{4}(-\\d{1,2}){1,3}(-\\d{6})(-\\p{Lu})?")
.matcher(str)
.results()
.map(MatchResult::group)
.collect(Collectors.toList());
}
Тест:
List<String> list = Arrays.asList(
"0456-5-1-3-060323", "0370-10-2-3-020323-П", "0369-10-020423-П","03.01.08"
);
System.out.println(filterData(list));
String str = "0456-5-1-3-060323; 0370-10-2-3-020323-П, 0369-10-020423-П 03.01.08";
System.out.println(filterString(str));
Результаты:
[0456-5-1-3-060323, 0370-10-2-3-020323-П, 0369-10-020423-П]
[0456-5-1-3-060323, 0370-10-2-3-020323-П, 0369-10-020423-П]