【问题标题】:Regular Expression for numerals in javajava中数字的正则表达式
【发布时间】:2018-12-24 10:04:54
【问题描述】:

在我的应用程序中,我需要数字的过滤器概念。所以我需要生成动态正则表达式格式。例如,如果我输入的是 (attrN = number,operator="equal",value=459) 和 (attrN = number,operator="小于等于",value=57) and (attrN = number,operator="not equal",value=45) and (attrN = number,operator="greaterthan equal",value=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 值。

标签: java regex java-8


【解决方案1】:

为此使用一个简单的界面

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) 和/或使实现通用以支持其他类型,例如双精度。

【讨论】:

  • 我想你不明白我的问题。我只要求数字正则表达式格式,如 \b([0-9]|[1-4][0-9]|5[ 0-7] | 459)\b
  • 我知道,我建议了一个替代解决方案,可以处理所有类型的比较
【解决方案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 的数字。否则如何从 \d* 否定 20-50 个数字
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 2015-04-27
  • 2014-09-18
  • 1970-01-01
  • 2016-09-28
  • 2013-01-18
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多