0

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

例子:

号码 允许输入:1.3, 22.3, 333.4,999.6

Number 不允许输入: 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;
    }
}
4

3 回答 3

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 + "}?$");
于 2012-04-25T05:23:51.910 回答
0
Pattern.compile("[1-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)"

试试这个....

于 2012-04-25T05:28:06.933 回答
0

您有以下问题:

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

  2. 您允许点后有 0 个数字,但您不想要它。

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

所以试试这个

mPattern = Pattern.compile("^[1-9][0-9]{0," + (digitsBeforeZero - 1) + "}((\\.[0-9]{1," + (digitsAfterZero - 1) + "})?)$");
                                                                                                          ^^^^
                                                                                                       really -1 ???
于 2012-04-25T05:36:34.517 回答