Регулярное выражение для чисел в Java

В моем приложении мне нужна концепция фильтра для числовых значений. Поэтому мне нужно сгенерировать динамический формат регулярного выражения. Например, если я ввел ввод как (attrN = число, оператор = "равно", значение = 459) и (attrN = число, оператор = "меньше, чем равно", значение = 57) и (attrN = число, оператор = "не равно", значение = 45) и (attrN = число, оператор = "больше, чем равно", значение = 1000). на основе вышеуказанных условий нужно разработать динамическое регулярное выражение. Я пробовал использовать меньшее, чем равное условие, но я не получил объединение и вычитание, также большее, чем равные условия. Мне нужна логика или алгоритм.

public class NumericRangeRegex {



    public String baseRange(String num, boolean up, boolean leading1) {

        char c = num.charAt(0);
        char low  = up ? c : leading1 ? '1' : '0';
        char high = up ? '9' : c;

        if (num.length() == 1)
            return charClass(low, high);

        String re = c + "(" + baseRange(num.substring(1), up, false) + ")";

        if (up) low++; else high--;

        if (low <= high)
            re += "|" + charClass(low, high) + nDigits(num.length() - 1);

        return re;
    }

    private String charClass(char b, char e) {
        return String.format(b==e ? "%c" : e-b>1 ? "[%c-%c]" : "[%c%c]", b, e);
    }

    private String nDigits(int n) {
        return nDigits(n, n);
    }

    private String nDigits(int n, int m) {
        return "[0-9]" + String.format(n==m ? n==1 ? "":"{%d}":"{%d,%d}", n, m);
    }

    private String eqLengths(String from, String to) {

        char fc = from.charAt(0), tc = to.charAt(0);

        if (from.length() == 1 && to.length() == 1)
            return charClass(fc, tc);

        if (fc == tc)
            return fc + "("+rangeRegex(from.substring(1), to.substring(1))+")";

        String re = fc + "(" + baseRange(from.substring(1), true, false) + ")|"
                + tc + "(" + baseRange(to.substring(1),  false, false) + ")";

        if (++fc <= --tc)
            re += "|" + charClass(fc, tc) + nDigits(from.length() - 1);

        return re;
    }    

    private String nonEqLengths(String from, String to) {
        String re = baseRange(from,true,false) + "|" + baseRange(to,false,true);
        if (to.length() - from.length() > 1)
            re += "|[1-9]" + nDigits(from.length(), to.length() - 2);
        return re;
    }

    public String run(int n, int m) {
        return  "\\b0*?("+ rangeRegex("" + n, "" + m) +")\\b";
    }

    public String rangeRegex(String n, String m) {
        return  n.length() == m.length() ? eqLengths(n, m)  : nonEqLengths(n, m);
    }
}

Зачем вам нужно регулярное выражение? Мне кажется, что использование для этого регулярных выражений сделает решение чрезвычайно запутанным. Это случай «если все, что у вас есть, это молоток, все выглядит как гвоздь»?

Dawood ibn Kareem 24.12.2018 11:08

Мне нужно разработать искусственный интеллект для генерации динамического числового регулярного выражения.

Shiva Goud A 24.12.2018 12:30

Помимо очень важного комментария от @DawoodibnKareem, нужно сказать, что здесь не задается никаких вопросов.

Joakim Danielson 24.12.2018 14:15

если я даю меньше 57, значит диапазон 0-57. тогда я могу понять логику и опубликовать рассматриваемую логику. но как отрицать число между 0-57, например (^ 54). в этом я не хочу 54 значение.

Shiva Goud A 24.12.2018 14:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Основываясь на условиях, я попробую объединить и вычесть `^ (?! 250) 0 *? ([0-9] | 2 (5 ([0-5]) | [0-4] [0-9]) | 1 [0-9] {2} | [1-9] [0-9] | 2000) $. Здесь мы сопоставляем диапазон от 1 до 255 и числовое число 2000 (объединение) и для отрицания 250 (вычитание). Это работает нормально.

Могу я узнать, как свести на нет диапазон чисел. Например: мне нужно сопоставить все числа выше 50, а также все числа ниже 20. иначе как отрицать 20-50 чисел из \ d *

Shiva Goud A 31.12.2018 13:53

Используйте для этого простой интерфейс

public interface Check {
    boolean isValidFor(int value);
}

Затем реализуйте разные классы для разных проверок, например

public class isEqualTo implements Check {
    private int valueToTestAgainst;

    public isEqualTo(int test) {
        valueToTestAgainst = test;
    }

    public boolean isValidFor(int value) {
        return valueToTestAgainst == value;
    }
}

public class isGreatherThan implements Check {
    private int valueToTestAgainst;

    public isGreatherThan(int test) {
        valueToTestAgainst = test;
    }

    public boolean isValidFor(int value) {
        return valueToTestAgainst > value;
    }
}

А затем создайте класс, который анализирует введенные данные и создает список объектов Check. Возможно, создайте абстрактный класс для хранения контрольного значения (valueToTestAgainst) и / или сделайте реализацию универсальной для поддержки других типов, таких как double.

Думаю, вы не поняли мою проблему. Я прошу использовать только числовой формат регулярного выражения, например \ b ([0-9] | [1-4] [0-9] | 5 [0-7] | 459) \ б

Shiva Goud A 26.12.2018 07:24

Я знаю это, я предложил альтернативное решение, которое будет работать со всеми видами сравнений.

Joakim Danielson 26.12.2018 07:45

Другие вопросы по теме