1

我从Android EditText 中的 Limit Decimal Places 中获取了一些代码。

正则表达式如下所示。我使用“3”作为digitsBeforeZero和“2”作为digitsAfterZero

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

它适用于除xxx之外的所有情况。当我尝试输入数字“ xxx.xx ”时,它不允许我在“ xxx ”之后输入“点 (.) ”。

请帮我理解Regex

4

2 回答 2

1

你的表达可以分解成部分更好地解释。假设你使用

int digitsBeforeZero=3;
int digitsAfterZero=2; 

正如你所建议的,我们有这样的表达:

"[0-9]{0,2}+((\\.[0-9]{0,1})?)||(\\.)?"

第一部分你有一个可以是任何数字的符号,括号内的部分是一个量词,它告诉前面有多少个符号是允许的,这种情况下它将接受 0、1 或 2 位数字,加号也是一个量词代表“一个或多个”,但由于在它之前没有符号,因此不需要它,只会掩盖表达式。在括号内,您会找到一个组,这用于匹配和检索表达式中的特定匹配项,您可以在此处阅读有关组的更多信息. 嵌套括号内的表达式将接受“。” 字符后跟 1 或 0 数字,括号外的问号表示它前面的表达式可以在或不在要匹配的字符串中。最后是'||' 是一个逻辑“或”,意味着它也将匹配它后面的表达式。该表达式将接受一个“。” 它可以存在或不存在(“?”量词),因此它也匹配一个空字符串。

如果您只想将 xxxx.yyyy 之类的字符串与 n 'x' 和 m 'y' 匹配,这是一个更好的方法:

"[0-9]{0,"+n+"}(\\.[0-9]{0,"+m+"})?"

更清楚的是,它也会匹配一个空字符串,一个“。” 但是它也会匹配像“333”这样的字符串。和“.33”,因此您必须根据需要对其进行调整。

于 2013-07-10T18:07:28.957 回答
0

从你的两个表达式中删除-1..

使用上面的表达式,您实际上是在尝试匹配输入 3,2 的小数点前 0 到 2 位和小数点后 0 到 1 位,因此它不允许您输入小数点 ( .)..

于 2013-07-10T17:39:00.377 回答