符号的解释
简单案例
public static void main(String[] args) {
String password = "jkllk111111111111";
boolean matches = password.matches("[a-zA-Z0-9]{8,16}");// [8,16]
System.out.println(matches);
// 电话号码
String phone = "12000000000";
boolean mat = phone.matches("1[3-9]\\d{9}");
System.out.println(mat);
// 2.要求去掉字母
String str = "121dgsdg3dgsdg122dgsdg14354sdgsdgasdghfj";
String replaceAll = str.replaceAll("[a-zA-Z]", "");
System.out.println(replaceAll);
// 3.拆分字符
String str1 = "fsgsdgdjlgoeto323fds\\dg4345ghfg43dsjfsdgs2314hfgh9306";
String[] split = str1.split("\\d+");
System.out.println(Arrays.toString(split));
//4.判断字符串是否是小数,如果是则转换成double类型
String str2 ="051.3";
String reg = "\\d+.\\d+";
if(str2.matches(reg)) {
System.out.println(Double.parseDouble(str2));
}
}
在开发中运用
方法一
Pattern pattern = Pattern.compile(“正则表达式”);
pattern.matcher(“校验的str”).matches();//matches()返回boolean值
案例:个人建议优先选方法一
if(packageInfo.getThirdPartyNetworkCode() != null){
String pmsCodeRegular = "[a-zA-Z]{3}";
Pattern pattern = Pattern.compile(pmsCodeRegular);
if(pattern.matcher(packageInfo.getThirdPartyNetworkCode()).matches()){
zhuoZhiPackageQO.setPoa(packageInfo.getThirdPartyNetworkCode());
}else {
throw new ApplicationRuntimeException("xxxxxxxxxxx");
}
}
方法二
Pattern pattern = Pattern.compile(“正则表达式”);
Matcher matcher = pattern.matcher(“校验的str”);
if(matcher.find()){} //matcher.find()返回boolean值
案例:
String str = "sdf";
if(str.length()==3) {
Pattern pattern = Pattern.compile("[a-zA-Z]{3}");
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println("yes");
} else {
System.out.println("no");
}
}else {
System.out.println("bug");
}
没有给校验的字段设置长度可能在开发中可能有bug,比如正则表达式为:[a-zA-Z]{3},那么abc符合正常,但是abcdef也符合,这是bug
解决方案:给校验的字段增加长度限制
matches 和 lookingAt 方法比较
matches() 和 lookingAt() 方法都用来尝试匹配一个输入序列模式。不同的是 matches() 要求整个序列都匹配,而 lookingAt() 不要求;
lookingAt() 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配;
这两个方法经常在输入字符串的开始使用。
public void matchAndLookingExample() {
String REGEX = "foo";
String INPUT = "foooooooooo";
String INPUT2 = "ooooofoooooo";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
Matcher matcher2 = pattern.matcher(INPUT2);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
System.out.println("lookingAt(): "+matcher2.lookingAt());
}
输出结果:
lookingAt(): true // 开头匹配
matches(): false // 不是整个序列都匹配
lookingAt(): false // 开头不匹配
常用的正则表达式
说明 | 正则表达式 |
---|---|
校验数字的表达式 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | |
数字 | ^ [0-9]*$ |
n位的数字 | ^\d{n}$ |
至少n位的数字 | ^\d{n,}$ |
m-n位的数字 | ^\d{m,n}$ |
非负整数 | ^\d+$ |
非正整数 | ^((-\d+) |
英文和数字 | ^ [A-Za-z0-9]+$ |
长度为3-20的所有字符 | ^.{3,20}$ |
由26个英文字母组成的字符串 | ^ [A-Za-z]+$ |
由数字、26个英文字母或者下划线组成的字符串 | ^\w+$ 或 ^\w{3,20}$ |
中文、英文、数字包括下划线 | ^ [\u4E00-\u9FA5A-Za-z0-9_]+$ |
中文、英文、数字但不包括下划线等符号 | ^ [\u4E00-\u9FA5A-Za-z0-9]+$ |
可以输入含有^%&’,;=?$"等字符 | [^%&’,;=?$\x22]+ |
禁止输入含有~的字符 | [^~\x22]+ |
特殊需求表达式 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | |
Email地址 | ^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$ |
域名 | [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? |
InternetURL | [a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$ |
手机号码 | ^(13[0-9] |
电话号码 | ^((\d{3,4}-) |
身份证号(15位、18位数字) | ^\d{15} |
短身份证号码(数字、字母x结尾) | ^([0-9]){7,18}(x |
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线) | ^ [a-zA-Z][a-zA-Z0-9_]{4,15}$ |
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线) | ^ [a-zA-Z]\w{5,17}$ |
日期格式 | ^\d{4}-\d{1,2}-\d{1,2} |
中国邮政编码 | [1-9]\d{5}(?!\d) (中国邮政编码为6位数字) |
腾讯QQ号 | [1-9][0-9]{4,} (腾讯QQ号从10000开始) |
IP地址 | \d+.\d+.\d+.\d+ (提取IP地址时有用) |
中文字符的正则表达式 | [\u4e00-\u9fa5] |