@Nanahuatzin

Java. Как «скормить» регулярку компилятору?

Здравствуйте, товарищи! Я - новичок как в деле программирования, так и в деле освоения регулярных выражений.

Вычитал задачку про то, что приходит заказ на Пиццерию, его нужно сформировать, задокументировать, а после того, как он будет готов - отправить курьеру.

Так вот, первым делом решил разобраться с валидацией формы заказа. Он должен быть вида:
"Имя, адрес, заказ, сумма". И тут же напоролся на регулярку. Сделал сначала по-своему - не работает. Перепробовал многое, но ничего не выходит. Кое-кто предложил мне вариант попроще, и в его примере всё происходит так, как описано кодом, но у меня - нет.

Вот мой код (и да не вытекут у вас глаза):
spoiler
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Pizza {

    public static String orderDescription() {

        System.out.println("Input a data about new order in format: \"name, address, order, sum\". Input data should go with commas and spaces.");
        Scanner scan = new Scanner(System.in);
        String record = scan.next();
        validateOrder(record);
        return record;
    }
    public static String validateOrder(String record) {

        Pattern patternRegexOrder = Pattern.compile("(.*), (.*), (.*), (\\d+(?:\\.\\d{0,2})?)");
        Matcher matcherRegexOrder = patternRegexOrder.matcher(record);
        while (matcherRegexOrder.find() == false) {
            System.out.println("Check input data:\n1) All data goes throw comma and space;\n2) Name - only literals;\n3) Address - no limits;\n4) Order - no limits;\n5) Sum - total sum in format \"000.00\"");
            orderDescription();
            }
        if (matcherRegexOrder.find()) {
            System.out.println("The order has been added to queue.");
            orderDescription();
        }
        return record;
    }
    public static void main(String[] args) throws IOException {
        orderDescription();
    }
}
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
@Nanahuatzin Автор вопроса
В общем, как правильно подсказал dodo512, метод для сканера был явно неверный.
Однако, в дебаге метод matcherRegexOrder.find() принимал значение True и тут же сбрасывался в False, поэтому тело if-a не читалось. Почему, я так и не понял.
Поменял на метод matcherRegexOrder.matches(), и дело пошло на лад.
Теперь работает так, как задумывалось. Кому интересно:
spoiler
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.fusesource.jansi.AnsiConsole;

public class Pizza {

    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_BLACK = "\u001B[30m";
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_GREEN = "\u001B[32m";
    public static final String ANSI_YELLOW = "\u001B[33m";
    public static final String ANSI_BLUE = "\u001B[34m";
    public static final String ANSI_PURPLE = "\u001B[35m";
    public static final String ANSI_CYAN = "\u001B[36m";
    public static final String ANSI_WHITE = "\u001B[37m";

    public static String orderDescription() {

        System.out.println(ANSI_GREEN + "\nВведите данные о новом заказе в формате: \"имя, адрес, заказ, сумма\". Данные нужно вводить через запятую с пробелом.\nЕсли вы хотите завершить программу - просто отправьте \"123\"" + ANSI_RESET);
        Scanner scan = new Scanner(System.in);
        String record = scan.nextLine();
        if (record.equals("123")) {
            System.out.println(ANSI_GREEN + "\nПрограмма завершена." + ANSI_RESET);
            scan.close();
            System.exit(0);
        };

        validateOrder(record);
        return record;
    };

    public static String validateOrder(String record) {

        Pattern patternRegexOrder = Pattern.compile("(\\D*), (.*), (.*), (\\d{1,}\\.\\d{2})");
        Matcher matcherRegexOrder = patternRegexOrder.matcher(record);
        while (matcherRegexOrder.matches() == false) {
            System.out.println(ANSI_RED + "\nПроверьте правильность ввода:\n1) Все данные вводятся через запятую с пробелом;\n2) Имя - только буквы;\n3) Адрес - цифры, буквы и любые символы;\n4) Заказ - цифры, буквы и любые символы;\n5) Сумма - итоговая сумма в формате \"000.00\"" + ANSI_RESET);
            orderDescription();
        };

        if (matcherRegexOrder.matches()) {
            System.out.println(ANSI_BLUE + "\nЗаказ добавлен в очередь ожидания." + ANSI_RESET);
            orderDescription();
        };
        
        return record;
    };
    public static void main(String[] args) throws IOException {
        AnsiConsole.systemInstall();
        orderDescription();
        };
};
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sotvm
@sotvm
Умный поймёт, а дураку и так всё равно.
вы уверены, что правильно ставите вопрос?
почему бы не скормить регулярку ещё кому/чему то ))
Ответ написан
Комментировать
xez
@xez Куратор тега Java
TL Junior Roo
Тут проблема не в регулярке, а в логике программы.
Если в validateOrder попадет неправильная строка - шанса исправиться программа не дает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы