正则表达式根据要求无法正常工作

时间:2012-04-25 05:18:01

标签: android regex

实际上我对我的正则表达式中使用的模式感到困惑。实际上我想要的是十进制之前用户想要输入的最大数字是三而数字不应该从零开始。输入小数点前的数字后,可以是三位数或两位数或一位数,但不能以零开始。我想允许用户在小数点后输入一位数,它应该不超过一位数。那么这些模式将是什么。

示例:

允许输入数字:1.3,22.3,333.4,999.6

号码不允许输入:0,0.1,.1,4444.67,333.78

我使用过的代码

tempEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(3,1)});

class DecimalDigitsInputFilter implements InputFilter
{

    Pattern mPattern;

    public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero)
    {
        mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
    {
        Matcher matcher = mPattern.matcher(dest);
        if(!matcher.matches())
        {
            return "";
        }
        return null;
    }

}

3 个答案:

答案 0 :(得分:1)

我认为你想要的模式是:

^[1-9]\d{0,2}\.\d?$

说明:

^        // Start of string
[1-9]    // First digit can't be 0
\d{0,2}  // Zero, one, or two more digits after first digit
\.       // Literal decimal point
\d?      // Optional single digit after decimal point
$        // End of string

在您的代码中,它将是:

mPattern = Pattern.compile("^[1-9]\\d{0," + (digitsBeforeZero - 1)
           + "}(\\.\\d{0," + digitsAfterZero + "})?$");

小数点和尾随数字附近的括号表示像“1”这样的数字。会不会匹配。这是一个需要小数点的版本,以及之后的数字可选:

mPattern = Pattern.compile("^[1-9]\\d{0," + (digitsBeforeZero - 1)
           + "}\\.\\d{0," + digitsAfterZero + "}?$");

答案 1 :(得分:0)

Pattern.compile("[1-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)"

试试这个......

答案 2 :(得分:0)

您有以下问题:

"[0-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)"
 ^^^^^                                              ^
  1                                                 2
  1. 您的模式在开始时允许0,但您不需要前导0

  2. 您在点后面允许0位数,但您不想要它。

  3. 您需要在正则表达式周围使用锚点以避免部分匹配(“Foo123.4Bar”将被允许)

  4. 所以试试这个

    mPattern = Pattern.compile("^[1-9][0-9]{0," + (digitsBeforeZero - 1) + "}((\\.[0-9]{1," + (digitsAfterZero - 1) + "})?)$");
                                                                                                              ^^^^
                                                                                                           really -1 ???