0

我在工作中做一些代码维护,我遇到了这个小片段......

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;
        }

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

下一部分 - 为什么以主的名义你会这样做,而不是强制文本仅是数字,并使用 Double.parseDouble() 或类似的东西?正则表达式是否值得快得多?

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

4

4 回答 4

1

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

http://gskinner.com/RegExr/

于 2012-07-24T20:28:21.787 回答
1

[0123456789]*

数字。括号告诉我们“其中任何一个都可以”。最后的星表示它可以以任意数量(零或更多)重复。

[.]?

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

[0123456789]{0,2}

花括号告诉我们可以重复多少次与以前相同的模式。{n,m} 可以理解为“重复至少 n 次但不超过 m 次”。这表示文本可以有从没有额外数字到 2 个额外数字。

于 2012-07-24T20:43:42.073 回答
0

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

不,没有理由在这个地方使用正则表达式而不是Double.parseDouble(). 事实上,在我进行的一次快速测试中,正则表达式的 10,000 次迭代所用的时间(348 毫秒)是Double.parseDouble()格式(71 毫秒)的 5 倍。另外,他调用了一个解析号码无论如何,以检查它是否是> 360f. 为什么?谁知道。

这里的编码员要么试图快速完成工作,要么不太了解 Java。我的猜测是后者,但我希望是前者。

PS:那是一个很棒的链接。成就了我的一天。:)

于 2012-07-24T20:29:43.527 回答
0

正则表达式(我可以肯定回答的唯一部分)没有按照作者的意图去做。基本上,它检查字符串是任意位数,然后是任何字符的 0 或 1,然后是 0 到 2 个整数位。

有效字符串将包括

1234567H12
q2
&

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

[\.]?

它也匹配空字符串。

于 2012-07-24T20:36:00.240 回答