java之正则表达式
1,概念
正则表达式,又称规则表达式。(英语:Regular Expression,常简写为regex)。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
支持正则表达式的有:PHP、Java、Python、JavaScript等。
有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的。
2,规则
2.1任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,匹配
String m="hello";
System.out.println(m.matches("hello"));
2.2 []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c
String m1="a";
System.out.println(m1.matches("[abc]"));
2.3 在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个
String s="-o";
System.out.println(s.matches("[-o]"));
System.out.println(s.matches("-[o]")); //在中括号外面能匹配到
System.out.println(s.matches("-[n-p]"));
System.out.println(s.matches("[-a-z]"));
2.4 ^在中括号里面和外面含义不同,如在外时,就表示开头,如 ^7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了这个字符之外的任意字符(包括数字,特殊字符),如[ ^abc]表示匹配出去abc之外的其他任一字符
String s="z^a";
System.out.println(s.matches("^z[^abc][abc]"));
2.5 .表示匹配任意的字符
String s="^&*H.";
System.out.println(s.matches("....."));
System.out.println(s.matches("....[.]"));
System.out.println(s.matches(".....\\."));
2.6 \d表示数字
String s="123";
System.out.println(s.matches("\\d\\d\\d")); //因为字符串中有三个数字,所以要有三个,每个\\d只匹配一个数字
System.out.println(s.matches("[0-9][0-9][0-9]"));
2.7 \D表示非数字
String s="abc";
System.out.println(s.matches("\\D\\D\\D"));
2.8 \w表示字母、数字、下划线,[a-zA-Z0-9_]
String s="d_9";
System.out.println(s.matches("[0-9A-Za-z_][0-9A-Za-z_][0-9A-Za-z_]"));
2.9 \W表示不是由字母、数字、下划线组成
String s="d_9";
System.out.println(s.matches("\\w\\w\\w"));
System.out.println(s.matches("[0-9A-Za-z_][0-9A-Za-z_][0-9A-Za-z_]"));
2.10 [\u4e00-\u9fa5]匹配汉字
String name="姓名:tom";
System.out.println(name.matches("[\u4e00-\u9f5a][\u4e00-\u9f5a]:[a-z][a-z][a-z]"));
System.out.println(name.matches("姓名:[a-z][a-z][a-z]"));
2.11
{n}表示出现n次
{n,m}表示出现n~m次
{n,}表示出现n次或n次以上
String a="abc";
System.out.println(a.matches("[a-z]{3}"));
System.out.println(a.matches("[a-z]{1,3}"));
System.out.println(a.matches("[a-z]{3}"));
?: 表示出现0次或1次
+表示出现1次或多次
*表示出现0次、1次或多次
String s="你好呀:666";
System.out.println(s.matches("[\u4e00-\u9f5a]{1,4}:\\w{3}"));
System.out.println(s.matches("[\u4e00-\u9f5a]{3}:\\w{3}"));
System.out.println(s.matches("[\u4e00-\u9f5a]{3,3}:\\w{3}"));
System.out.println(s.matches("[\u4e00-\u9f5a]+:\\w{3}")); //+表示1次以及以上
System.out.println(s.matches("[\u4e00-\u9f5a]*:\\w{3}")); //*表示任意次数
System.out.println(s.matches("[\u4e00-\u9f5a]?:\\w{3}")); //? 表示0或1次,因为有3个数字,所以应为false
补充知识点:断言,预测,排除
(?!正则 ) 预测,排除
案例1:接受用户输入的一个字符串,判断是否为hellokitty
Scanner sc = new Scanner(System.in);
System.out.print("请输入字符串:");
String s = sc.next();
System.out.println(s.matches("hellokitty"));
System.out.println(s.matches("\\w{10}"));
案例2:判断由至少5个字母组成的字符串
Scanner sc = new Scanner(System.in);
System.out.print("请输入字符串:");
String s = sc.next();
System.out.println(s.matches("\\w{5,}"));
案例3:qq邮箱:6-11数字@qq.com
String s="1071461302@qq.com";
System.out.println(s.matches("\\d{6,11}[@]qq\\.com"));
System.out.println(s.matches("\\d*[@]qq\\.com"));
System.out.println(s.matches("\\d{6,11}[@][a-z]{2}\\.[a-z]{3}"));
案例4:密码校验:8-20位,小写字母、大写字母、数字中的至少两种
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 5 ; i++) { //这里为了方便验证,可以使用循环
System.out.print("请输入字符串:");
String s = sc.next();
//思路:因为有很多情况,所以我们利用断言,来进行逆向考虑,
//排除全是数字,排除全是小写字母和全是大写字母,剩下的便是其他的可能性,也是我们想要的组合
if (s.matches("(?![a-z]{8,20}$)(?![A-Z]{8,20})(?!\\d{8,20}$)[a-zA-Z0-9]{8,20}")){
System.out.println("正确");
}else {
System.out.println("错误");
}
}
案例5:某网站要求账号的密码只能是:字母和数字,不能都是字母,不能都是数字,且要求字母开头,长度在6-12之间
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 5; i++) {
System.out.print("请输入密码字符串:");
String s = sc.next();
if (s.matches("(?![a-z]{6,12}$)(?![0-9]{6,12}$)(?![A-Z]{6,20}$)^[a-zA-Z][a-zA-Z0-9]{5,11}$")){
System.out.println("密码正确");
}else {
System.out.println("密码错误");
}
}