我正在做一些代码维护工作,我跑过这个小片段......
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
答案 0 :(得分:1)
你可以测试在线工具上的硬正则表达式,例如这个很酷的网站:
答案 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
&
等。如果作者想要匹配一个点,那么正则表达式的那部分应该是:
[\.]?
它也匹配空字符串。