В моем приложении мне нужна концепция фильтра для числовых значений. Поэтому мне нужно сгенерировать динамический формат регулярного выражения. Например, если я ввел ввод как (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);
}
}
Мне нужно разработать искусственный интеллект для генерации динамического числового регулярного выражения.
Помимо очень важного комментария от @DawoodibnKareem, нужно сказать, что здесь не задается никаких вопросов.
если я даю меньше 57, значит диапазон 0-57. тогда я могу понять логику и опубликовать рассматриваемую логику. но как отрицать число между 0-57, например (^ 54). в этом я не хочу 54 значение.




Основываясь на условиях, я попробую объединить и вычесть `^ (?! 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 *
Используйте для этого простой интерфейс
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) \ б
Я знаю это, я предложил альтернативное решение, которое будет работать со всеми видами сравнений.
Зачем вам нужно регулярное выражение? Мне кажется, что использование для этого регулярных выражений сделает решение чрезвычайно запутанным. Это случай «если все, что у вас есть, это молоток, все выглядит как гвоздь»?