这个正则表达式做了什么?为什么要用它?

时间:2012-07-24 20:17:59

标签: android regex text floating-point

我正在做一些代码维护工作,我跑过这个小片段......

public CharSequence filter(CharSequence source, int start,
                int end, Spanned dest, int dstart, int dend) {
            if (end > start) {
                String destTxt = dest.toString();
                String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend);

                try {
                    if (!resultingTxt.matches("[0123456789]*[.]?[0123456789]{0,2}")||
                            Float.parseFloat(resultingTxt)>360f) {
                        if (source instanceof Spanned) {
                            SpannableString sp = new SpannableString("");
                            return sp;
                        } else {
                            return "";
                        }

                    }
                } catch (NumberFormatException nfe) {
                    // doesn't matter.
                }
            }
            return null;
        }

现在我不是一名注册专家,但在我看来,这是一种非常冗长的检查文本框是否为空的方法,包含0到360之间的数字,小数精度不超过2,而且不包含文字。我错过了什么吗?这来自一个Android EditText。

下一部分 - 为什么在主的名字中你会这样做,而不是强制文本只是数字,并使用Double.parseDouble()或一些等价物?正则表达式的价值要快得多吗?

这段代码很乱,所以如果这个人一直在阅读我不会感到惊讶 - http://freeworld.thc.org/root/phun/unmaintain.html

4 个答案:

答案 0 :(得分:1)

你可以测试在线工具上的硬正则表达式,例如这个很酷的网站:

http://gskinner.com/RegExr/

答案 1 :(得分:1)

  

[0123456789] *

位数。括号告诉我们“其中任何一个都会这样做”。最后的明星说它可以重复任何数量(零或更多)。

  

[。]

同样,括号中写着“其中任何一个”。它可以删除(只有一个选项),但点“。”如果它出现在括号之外,它在正则表达式中也有意义:它表示“任何字符都可以”。要使用点作为字符,它应该被转义(可能是“\。?”)。 “?”告诉我们这可能发生一次或零次。在括号内,点不会表现为元字符。

  

[0123456789] {0,2}

花括号告诉我们可以完成与之前相同模式的重复次数的范围。 {n,m}可以读作“重复至少n次但不超过m次”。这表示文本可以没有额外的数字,最多2个额外数字。

答案 2 :(得分:0)

你假设所有正则表达式都确认输入是一个数字,不是空的,并且不超过2位小数,这是正确的。

不,没有理由在这个地方使用正则表达式而不是Double.parseDouble()。事实上,在一个快速测试中,我聚集在一起,10,000个正则表达式的迭代比Double.parseDouble()格式(71ms)长约5倍(348ms)。另外,他打电话给ANYWAY号码进行解析,检查它是否为> 360f。为什么?谁知道呢。

这里的编码器要么是想快速完成工作,要么就是不能很好地理解Java。我的猜测是后者,但我希望它是前者。

PS:这是一个很棒的链接。让我的一天。 :)

答案 3 :(得分:0)

正则表达式(我能够肯定地回答的唯一部分)没有做到作者打算做的事情。基本上,它检查字符串是否为任意数字,然后是任何字符的0或1,然后是0到2个整数位。

有效字符串包括

1234567H12
q2
&

等。如果作者想要匹配一个点,那么正则表达式的那部分应该是:

[\.]?

它也匹配空字符串。