使用Regex确定Decimal、Fraction或Invalid



如果用户的输入是小数、分数、混合分数或无效,我如何确定?

这是我的程序上允许的输入

String[] s = new String[]{ "0",".",".0",".01","1.","1.0","1.01", "1 ","1 1","1/2","1/","1/0", "1 1/1", "1 0/0","1 /","1 /0", "1 0/"};

预期输出:

0) 0  ----  Zero
1) .  ----  Error
2) .0  ----  Zero
3) 0.01  ----   Decimal
4) 1.  ----  Decimal(the input 1. should be turned to decimal)
5) 1.0  ----   Decimal
6) 1.01  ----   Decimal
7) 1   ----  Decimal(the input with space after the whole number must be decimal)
8) 1 1  ----  Error(because of the space between the 1)
9) 1/2  ----  Fraction
10) 1/  ----  Error
11) 1/0  ----  Error
12) 1 1/1  ----  Mixed Fraction
13) 1 0/0  ----  Error
14) 1 /  ----  Error
15) 1 /0  ----  Error
16) 1 0/  ----  Error

实际输出:

0) 0  ----  Zero
1) .  ----  Error
2) .0  ----  Zero
3) 0.01  ----   Decimal
4) 1.  ----  Error
5) 1.0  ----   Decimal
6) 1.01  ----   Decimal
7) 1   ----  Error
8) 1 1  ----  Mixed Fraction
9) 1/2  ----  Fraction
10) 1/  ----  Fraction
11) 1/0  ----  Fraction
12) 1 1/1  ----  Mixed Fraction
13) 1 0/0  ----  Error
14) 1 /  ----  Error
15) 1 /0  ----  Error
16) 1 0/  ----  Error

我对如何构建一个好的正则表达式模式没有太多知识?

我的代码:

public class DecimalOrFraction {
    public static void main(String args[]){
        String[] s = new String[]{ "0",".",".0",".01","1.","1.0","1.01", "1 ","1 1","1/2","1/","1/0", "1 1/1", "1 0/0","1 /","1 /0", "1 0/"};
        for (int x = 0 ;x<s.length;x++) {
            if(s[x].matches("[0]?([.][0]{1,3}\s{0,1})?")){
                System.out.println(x+") "+s[x]+"  ----  Zero"); 
            }
            else if(s[x].matches("\d{0,3}([.]\d{1,3}\s{0,1})?")){
                System.out.println(x+") "+Float.valueOf(s[x])+"  ----   Decimal");
            }
            else if(s[x].matches("[1-9]{1,5}([.]\d{1,3})?\s[1-9]\d{0,2}([/]\d{0,3})?")){
                System.out.println(x+") "+s[x]+"  ----  Mixed Fraction");
            }
            else if(s[x].matches("[1-9]\d{0,4}[/]\d{0,3}")){
                System.out.println(x+") "+s[x]+"  ----  Fraction");
            } 
            else{
                System.out.println(x+") "+s[x]+"  ----  Error");    
            }
        }
    }
}

为了展示将函数拆分为多个部分时可以做什么,我创建了一些代码。请注意,这并不构成一个明确的(类)设计。

这段代码的优点是,您可以用您解析的值来执行操作。提供良好的错误消息也很有用。如果将main方法进一步拆分,则可以创建一个实时验证值的解析器(例如,如果希望在GUI中验证值,则非常有用)。

public class Numbers {
private static final String[] s = new String[]{ "0",".",".0",".01","1.","1.0","1.01", "1 ","1 1","1/2","1/","1/0", "1 1/1", "1 0/0","1 /","1 /0", "1 0/"};
    private static final Pattern FRACTION_PATTERN = Pattern.compile("(?:(\d+)\s+)?(\d+)/(\d+)");
    public static void main(String[] args) {
        int counter = 0;
        for (String value : s) {
            counter++;
            String trimmedValue = value.trim();
            if (isNumber(trimmedValue)) {
                System.out.printf("%d) %s ---- Natural number%n", counter, trimmedValue);
                continue;
            }
            boolean parseDecimal = isProbablyDecimal(trimmedValue);
            boolean parseFraction = isProbablyFraction(trimmedValue);
            if (parseDecimal && parseFraction) {
                System.out.printf("%d) %s ---- Error (both decimal & fraction)%n", counter, trimmedValue);
                continue;
            }
            if (parseDecimal) {
                if (!trimmedValue.matches("\d*[.]\d+")) {
                    System.out.printf("%d) %s ---- Error (invalid decimal)%n", counter, trimmedValue);
                    continue;
                }
                System.out.printf("%d) %s ---- Decimal value%n", counter, trimmedValue);
                continue;
            }
            if (parseFraction) {
                Matcher m = FRACTION_PATTERN.matcher(trimmedValue);
                if (!m.matches()) {
                    System.out.printf("%d) %s ---- Error (invalid faction)%n", counter, trimmedValue);
                    continue;
                }
                if (Integer.valueOf(m.group(3)) == 0) {
                    System.out.printf("%d) %s ---- Error (division by zero in fraction)%n", counter, trimmedValue);
                    continue;
                }
                if (m.group(1) != null) {
                    System.out.printf("%d) %s ---- Mixed fraction%n", counter, trimmedValue);
                    continue;
                }
                System.out.printf("%d) %s ---- Fraction%n", counter, trimmedValue);
                continue;
            }
            System.out.printf("%d) %s ---- Error (Cannot make bread out of it)%n", counter, trimmedValue);
            continue;
        }
    }
    public static boolean isNumber(String value) {
        return value.matches("\d+");
    }
    public static boolean isProbablyDecimal(String value) {
        // note, some countries use comma instead of dot
        return value.contains(".");
    }
    public static boolean isProbablyFraction(String value) {
        return value.contains("/");
    }
}

输出:

1) 0 ---- Natural number
2) . ---- Error (invalid decimal)
3) .0 ---- Decimal value
4) .01 ---- Decimal value
5) 1. ---- Error (invalid decimal)
6) 1.0 ---- Decimal value
7) 1.01 ---- Decimal value
8) 1 ---- Natural number
9) 1 1 ---- Error (Cannot make bread out of it)
10) 1/2 ---- Fraction
11) 1/ ---- Error (invalid faction)
12) 1/0 ---- Error (division by zero in fraction)
13) 1 1/1 ---- Mixed fraction
14) 1 0/0 ---- Error (division by zero in fraction)
15) 1 / ---- Error (invalid faction)
16) 1 /0 ---- Error (invalid faction)
17) 1 0/ ---- Error (invalid faction)

试试这个:d+.d+|d+.$|^.0$|d+/[1-9]+|d+ d+/[1-9]+

这将为您的示例返回正确的值:

^(d*.?d*)s?(d+/[1-9]d*)?$

RegExr 的工作示例

在Java中,它将是:^(\d*\.?\d*)\s?(\d+/[1-9]\d*)?$

最新更新