Задать паттерн для строки

Рейтинг: -1Ответов: 1Опубликовано: 13.03.2023

Просьба подсказать как можно добавить паттерн для парсера/метода для строки примеры:

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-П]