Java 如何限制小数点前/后/的位数以及正则表达式的总体位数?
我试图检查一个数值是否有特定数量的数字Java 如何限制小数点前/后/的位数以及正则表达式的总体位数?,java,regex,Java,Regex,我试图检查一个数值是否有特定数量的数字 总共不应该超过19位 小数点前不应超过17位(整数部分) 小数点后不得超过4位(小数部分) 可以有小数点,也可以没有小数点 前面可以有+或-或不 有效例子: 一, 1.0 .0 12345678901234567.12 +12345678901234567.12 -12345678901234567.12 1234567890123345.1234 +1234567890123345.1234 -1234567890123345.1234 无效示例
- 一,
- 1.0
- .0
- 12345678901234567.12
- +12345678901234567.12
- -12345678901234567.12
- 1234567890123345.1234
- +1234567890123345.1234
- -1234567890123345.1234
- 12345678901233456.1234//因为有20位数字
- 1234567890123345678.1//因为小数点前有超过17位数字
- 1.12345//因为小数点后有4位以上的数字
@Test
public void testTutorialCode() {
//min two, max four digits for the whole expression
Pattern p = Pattern.compile("\\A(?=(?:[^0-9]*[0-9]){2,4})\\z");
assertFalse(p.matcher("+1234.0").matches());
assertTrue(p.matcher("12").matches());
assertTrue(p.matcher("12.12").matches());
assertTrue(p.matcher("+123.0").matches());
assertFalse(p.matcher("1234.0").matches());
}
您可以使用\A(?=.*\d)(?!(?:\d*\d){20,}[+-]?\d{0,17}(?:\.\d{1,4})?\z
。记得在java代码中使用双反斜杠
-匹配字符串的开头\A
检查是否至少有一个数字(因为基本上所有数字都是可选的)(?=.*\d)
检查数字是否不超过19位(?!(?:\D*\D){20,})
匹配可选的[+-]?
或+
-
最多匹配17位整数部分\d{0,17}
匹配小数部分最多4位数字,如果(?:\。\d{1,4})
有效,则可以使用12.
{0,4}
匹配字符串的结尾\z
Pattern p = Pattern.compile("(-)?(\\+)?(\\d+)\\.(\\d+)");
Matcher m = p.matcher("1234567890123456.1234");
if(m.find()){
if(m.group(3).length()<=17 && m.group(4).length()<=4 && (m.group(3).length()+m.group(4).length()<20)){
System.out.println("Correct");
}
}
Pattern p=Pattern.compile((-)(\\+)?(\\d+)\.(\\d+);
匹配器m=p.Matcher(“12345678901233456.1234”);
if(m.find()){
if(m.group(3).length()是否必须是一个正则表达式。通过循环这些数字字符串的各个字符,这些要求听起来很简单。遗憾的是,这个正则表达式(..\\d{0,17}\\W\\d{0,4})
不完全有效,因为我不确定如何将总长度限制在20。谢谢你的想法,但不幸的是,我只限于纯正则表达式。因此我接受了塞巴斯蒂安·普罗斯克的答案。@gill.当然,没有遗憾。我也对这个答案投了赞成票:)