Регулярное выражение и вычитание для числовых - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь получить объединение регулярных выражений и вычитаний, я умею работать только так.String regex = "[1-3[5-7]]";, но нужен другой тип чисел с диапазоном и в то же время объединение, например String regex = "\b([1-9]|[1-4][0-9]|5[0-5]&&[191])\b";. В этой строке я могу найти совпадения от 1 до 55, а также совпадение с 191. Это не работает. Может ли кто-нибудь подсказать, гдепроблема получения.Я пытался для числового диапазона, как показано ниже.

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);
    }
}

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

В зависимости от условий, которые я попытаюсь объединить, вычитание будет `^ (?! 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 (вычитание). Работает нормально.

0 голосов
/ 18 декабря 2018

Я думаю, что вы на неправильном пути.Вы должны просто извлечь и проанализировать числовые значения и выполнить вычисления на вашем обычном языке программирования, как рекомендует Патрик.

Вы все еще можете создать класс-обертку, который помогает проверять числовые диапазоны, используя простую функцию, такую ​​как * 1003.*

public static boolean between(int i, int minValueInclusive, int maxValueInclusive) {
    return (i >= minValueInclusive && i <= maxValueInclusive);
}

или используйте commons.lang.Range :

Range<Integer> myRange = Range.between(1, 55);
if (myRange.contains(value)){
    // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...