Как корректно обработать строку
Как сделать, чтобы когда читал текстовый файл с таким содержимым, разделителями являются "/":
Иван/10000/Первый - это сейчас проходит
Петров Петрович Пётр/20000/Второй - это не проходит, а должно
Ситов /13000.1234134/Первый - невалидно, больше 2 цифр после точки в зп - 1234134, максимум 12 должно быть
Курбян -13000.12/Второй - невалидный, есть минус в числе
Кошкин 13000.12/Четвёртый- валидный, потому что фио, цифры, департамент - подходят по условию
43242/13424/Третий - невалидный, вместо фио цифры
Жестков/13424/43242 - невалидный, вместо департамента цифры
Петровна/привет/Третий - невалидный, вместо зп цифры
Иванович/-10000/Третий -невалидно, есть минус у зп
/ 132/ Четвертый - невалидно, ничего нет на месте фио и зп из 3 цифр быть не может, минимум от 5 цифр
Петров/10000/Пятый - валидно
Иванов/30000/ШЕСТОЙ -валидно
Сидоров/20000/Седьмой - валидно
Пушкин/40000/Восьмой - валидно
На данный момент программа обрабатывают почти как надо, кроме как того, что не выводит ФИО полностью, считает эту строку невалидной. Нужно, чтобы он мог вывести её.
Также проблемой является, что не совсем понимаю как подставить информацию о том, по какой причине строка могла не пройти. Например, строка не прошла проверку по причине некорректного ввода ФИО и подобного рода. Пытался сделать вот так:
if (strings.length < 3) continue;
Else System.out.println("Неверное количество слов");
Но некорректно выводит, непонятно почему по несколько раз показывается сообщение, где даже нет ошибок.
String regex = "[А-Яа-яЁёA-Za-z]+";
while ((s = br.readLine()) != null) {
if (!(s = s.trim()).isEmpty()) {
String[] strings = s.split("\\/");
if (strings.length < 3)
continue;
if (!(strings[0].matches(regex) && strings[2].matches(regex)))
continue;
if (!strings[1].matches("\\d{5}(\\.\\d{1,2})?"))
continue;
System.out.println(strings[0] + " " + strings[1] + " " + strings[2]);
}
}
Ответы (1 шт):
Не знаю, зачем вам столько регулярок и условий...Все вроде просто. @lombok.Data - если не пользуетесь, то можете убрать (добавляет геттеры, сеттеры и прочие стандартные методы). Если уберете - переопределяйте toString сами. И не забывайте изменить путь и имя файла.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@lombok.Data
public class Person {
private String name;
private String value1;
private String value2;
public Person(String... args) {
this.name = args[0].trim();
this.value1 = args[1].trim();
this.value2 = args[2].trim();
}
public static List<Person> fromFile(String fileName, String separator) throws IOException {
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
return stream
.map(line -> line.split(separator))
.filter(arr->arr.length==3)
.map(Person::new)
.collect(Collectors.toList());
}
}
public static void main(String args[]) throws IOException {
Person.fromFile("1.txt", "/").forEach(System.out::println);
}
}