工作中遇到要在后台校验金额格式,草草看了下
正则表达式,写了第一个
String regex_normal = "[0-9]{1,14}\\.{0,1}[0-9]{0,2}";//16位整数或小数(两位);
中括号[0-9]表示0到9这10个数字,花括号{1,14}表示可以出现次数为1到14次,后面同理。
其中小数点 \\. 第一个反斜杠是java的转义,第二个是对 . 的转义。
仔细看了下,
发现有bug,对 1. 这样的金额也能通过。
改进一下
String regex_strict = "[0-9]{1,14}(\\.{0,1}[0-9]{1,2})?";//16位整数或小数(两位);
多了()?, ? 表示圆括号内容可惜重复1或0次。
测试源码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public
class RegexpTest {
public static void main(String[] args){
Pattern pattern_normal;
Pattern pattern_strict;
String regex_normal = "[0-9]{1,14}\\.{0,1}[0-9]{0,2}";//16位整数或小数(两位);
String regex_strict = "[0-9]{1,14}(\\.{0,1}[0-9]{1,2})?";//16位整数或小数(两位);
String integer_1 = "1";
String integer_2 = "12";
String integer_3 = "123";
String float_1 = "1.2";
String float_2 = "1.23";
String float_3 = "1.234";
String float_0 = "1.";
pattern_normal = Pattern.compile(regex_normal);
pattern_strict = Pattern.compile(regex_strict);
System.out.println("pattern_normal 匹配 " + integer_1 + " :" + pattern_normal.matcher(integer_1).matches());
System.out.println("pattern_strict 匹配 " + integer_1 + " :" + pattern_strict.matcher(integer_1).matches());
System.out.println("pattern_normal 匹配 " + integer_2 + " :" + pattern_normal.matcher(integer_2).matches());
System.out.println("pattern_strict 匹配 " + integer_2 + " :" + pattern_strict.matcher(integer_2).matches());
System.out.println("pattern_normal 匹配 " + integer_3 + " :" + pattern_normal.matcher(integer_3).matches());
System.out.println("pattern_strict 匹配 " + integer_3 + " :" + pattern_strict.matcher(integer_3).matches());
System.out.println("pattern_normal 匹配 " + float_0 + " :" + pattern_normal.matcher(float_0).matches());
System.out.println("pattern_strict 匹配 " + float_0 + " :" + pattern_strict.matcher(float_0).matches());
System.out.println("pattern_normal 匹配 " + float_1 + " :" + pattern_normal.matcher(float_1).matches());
System.out.println("pattern_strict 匹配 " + float_1 + " :" + pattern_strict.matcher(float_1).matches());
System.out.println("pattern_normal 匹配 " + float_2 + " :" + pattern_normal.matcher(float_2).matches());
System.out.println("pattern_strict 匹配 " + float_2 + " :" + pattern_strict.matcher(float_2).matches());
System.out.println("pattern_normal 匹配 " + float_3 + " :" + pattern_normal.matcher(float_3).matches());
System.out.println("pattern_strict 匹配 " + float_3 + " :" + pattern_strict.matcher(float_3).matches());
}
}
输出:
pattern_normal 匹配 1 :true
pattern_strict 匹配 1 :true
pattern_normal 匹配 12 :true
pattern_strict 匹配 12 :true
pattern_normal 匹配 123 :true
pattern_strict 匹配 123 :true
pattern_normal 匹配 1. :true
pattern_strict 匹配 1. :false
pattern_normal 匹配 1.2 :true
pattern_strict 匹配 1.2 :true
pattern_normal 匹配 1.23 :true
pattern_strict 匹配 1.23 :true
pattern_normal 匹配 1.234 :false
pattern_strict 匹配 1.234 :false
还想对0 0.0 0.00这样的金额过滤,暂时不知道怎么写,希望
高手帮忙。现在暂时是先格式校验通过后再用数值和0比较。