正则表达式
常用
参考:http://blog.csdn.net/zfszhangyuan/article/details/52451240
/**用户名
* [a-z0-9_-] 匹配列表中的字符,a-z,0–9,下划线,连字符
* {3,15} 长度至少3个字符,最大长度为15
*/
public static final String USERNAME="^[a-z0-9_-]{3,15}$";
public static boolean isUsername(String regx) {
return Pattern.matches(USERNAME, regx);
}
/**密码
* ( 组开始
* (?=.*\d) 必须包含一个数字
* (?=.*[a-z]) 必须包含一个小写字符
* (?=.*[A-Z]) 必须包含一个大写字符
* (?=.*[@#$%]) 必须包含一个列表中的特殊字符"@#$%"
* {6,20} 长度至少为6个字符,最大长度为20
*/
public static final String PASSWORD="((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})";
public static boolean isPassword(String regx) {
return Pattern.matches(PASSWORD, regx);
}
/**邮箱
* [_A-Za-z0-9-]+ 必须以中括号中的字符为起始字符[],必须包含一个或多个(+)
* ( 组#1开始
* \\.[_A-Za-z0-9-]+ 接下来是一个点"."和中括号内的字符[],必须包含一个或者多个(+)
* )* 组#1结束, 这个组是可选的(*)
* @ 必须包含一个"@"符号
* [A-Za-z0-9]+ 接下来是中括号内的字符[],必须包含一个或者多个(+)
* ( 组 #2开始 – 一级TLD检查
* \\.[A-Za-z0-9]+ 接下来是一个点"."和中括号内的字符[],必须包含一个或者多个(+)
* )* 组#2结束,这个组是可选的(*)
* ( 组#3开始 – 二级TLD检查
* \\.[A-Za-z]{2,} 接下来是一个点"."和中括号内的字符[], 最小长度为2
* ) 组#3结束
*/
public static final String EMAIL="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
public static boolean isEmail(String regx) {
return Pattern.matches(EMAIL, regx);
}
量词
贪婪 | 惰性 | 描述 |
---|---|---|
? | ?? | 零次或一次出现 |
* | *? | 零次或多次出现 |
+ | +? | 一次或多次出现 |
{n} | {n}? | n次出现 |
{n,m} | {n,m}? | 至少n次至多m次出现 |
{n,} | {n,}? | 至少n次出现 |
量词贪婪和惰性举例:
String str1="abbbaabbbaaabbb1234";
Pattern r1 = Pattern.compile(".*bbb");
Matcher m1 = r1.matcher(str1);
if(m1.find()){
System.out.println("Found value: " + m1.group(0) );//abbbaabbbaaabbb
}
Pattern r2 = Pattern.compile(".*?bbb");
Matcher m2 = r2.matcher(str1);
if(m2.find()){
System.out.println("Found value: " + m2.group(0) );//abbb
}
断言
用于找到字符串中以自定义规则结尾的字符串,比如找到字符串”abbbaabbbaaabbb1234”中所有以”a”结尾的字符串”abbb”:
String str1="abbbaabbbaaabbb1234";
Pattern r1 = Pattern.compile("(abbb)(?=a)");
Matcher m1 = r1.matcher(str1);
int count1=0;
while(m1.find()){
System.out.println("Found value: " + m1.group(count1++) );//打印两次abbb
}
用于判断一个字符串是否包含自定义规则
String str2="123aaa456aaa";
System.out.println(Pattern.matches("(?=.*aaa).{12}",str2));//是否包含aaa且总长度为12?true
System.out.println(Pattern.matches("(?=.*aab).{12}",str2));//是否包含aab且总长度为12?false
计算
double四舍五入
//使用DecimalFormat,推荐
DecimalFormat df = new DecimalFormat("#.00");
df.setRoundingMode(RoundingMode.UP);
System.out.println(df.format(10.555));//10.56
//使用BigDecimal,计算时推荐
System.out.println(new BigDecimal(10.555).setScale(2, RoundingMode.UP).doubleValue());//10.56
//使用Math.round
System.out.println((double)Math.round(10.555*100)/100);//10.56
时间
private static SimpleDateFormat dateF = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat dateM = new SimpleDateFormat("yyyy-MM");
//取得距离当前月n个月的月份最后一天
public static String getMonthLastDay(int monthDistance){
Calendar cal= Calendar.getInstance();
cal.set(Calendar.MONTH,monthDistance);
cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));
String lastDay=dateF.format(cal.getTime());
return lastDay;
}
//取得距离当前月n个月的月份第一天
public static String getMonthFirstDay(int monthDistance){
Calendar cal= Calendar.getInstance();
cal.set(Calendar.MONTH,monthDistance);
cal.set(Calendar.DAY_OF_MONTH,1);
String first=dateF.format(cal.getTime());
return first;
}