一、逻辑运算符
逻辑运算符 | 含义 |
---|---|
&& | 并且 |
| | 或者 |
//需求: 按照如下要求,使用正则表达式,完成字符串内容的验证。
//1、验证字符串是小写辅音字符开头,后跟ad 除了a,e,i,o,u之外,其他的都是辅音字母
//2、验证字符串是aeiou 中的某个字符开头,后跟ad。
String redex="[[a-z]&&[^aeiou]]ad";
String redex1="[a|e|i|o|u]ad";
//String redex1 = "[aeiou]ad";
String str="bad";
String str1="aad";
System.out.println(str.matches(redex));
System.out.println(str1.matches(redex));
System.out.println("--------------");
String str2="aad";
System.out.println(str2.matches(redex1));
二、数量词
数量词 | 含义 |
---|---|
X? | 0次或1次 |
X* | 0次到多次 |
X+ | 1次或多次 |
X{n} | 恰好n次 |
X{n,} | 至少n次 |
X{n,m} | n到m次(n和m都是包含的) |
//需求: 按照如下要求,使用正则表达式,完成字符串内容的验证
//1.验证str是否是三位数字
//2.验证str是否是多位数字:最少一位
//3.验证str 是否是手机号
String regex="\\d{3}";
String regex1="\\d+";
String regex2="1[358]\\d{9}";
String s="123";
String s1="1234";
System.out.println(s.matches(regex));
System.out.println(s1.matches(regex));
System.out.println("---------------");
String s2="";
String s3="1234";
System.out.println(s2.matches(regex1));
System.out.println(s3.matches(regex1));
System.out.println("---------------");
String s4 = "13637326896";
String s5 = "1234";
System.out.println(s4.matches(regex2));
System.out.println(s5.matches(regex2));
三、预定义字符
预定义字符 | 含义 |
---|---|
“\d” | 任何数字[0-9]的简写 |
“\D” | 任何非数字[^0-9]的简写 |
“\s” | 空白字符: [ \t\n\x0B \f\r] 的简写 |
“\s” | 非空白字符[^\s] 的简写 |
“\w” | 单词字符: [a-zA-Z_0-9]的简写 |
“\W” | 非单词字符: [^\w] 的简写 |
“.” | 匹配任何字符。如果要表示一个字符点,那么就得使用 \. |
//需求: 按照如下要求,使用正则表达式,完成字符串内容的验证
//1、验证str是否是3位数宁
//2、验证手机号: 1开头,第二位: 3/5/8,剩下9位都是0-9的数字
//3、验证字符串是否以h开头,以d结尾,中间是任何字符
//4、验证str是否是: had.
Scanner sc = new Scanner(System.in);
String regex="\\d\\d\\d";
String regex1="1[3|5|8]\\d\\d\\d\\d\\d\\d\\d\\d\\d";
String regex2="h.d";
String regex3="had\\.";
while (true) {
System.out.println("请输入一个字符串:");
String str=sc.next();
System.out.println(str.matches(regex));
System.out.println(str.matches(regex1));
System.out.println(str.matches(regex2));
System.out.println(str.matches(regex3));
}
四、字符类
字符类 | 含义 |
---|---|
[abc] | 代表a或者b,或者c字符中的一个 |
[^abc] | 代表除abc以外的任何字符 |
[a-z] | 代表a-z的所有小写字符中的一个 |
[A-Z] | 代表A-Z的所有大写字符中的一个 |
[0-9] | 代表0-9之间的某一个数字字符 |
[a-zA-Z0-9] | 代表a-z或者A-Z或者0-9之间的任意一个字符 |
[a-dm-p] | a-d或m-p之间的任意一个字符 |
//需求:
//验证str是否以h开头,以d结尾,中间是a,e,i,o,u中某个字符
//验证str是否以h开头,以d结尾,中间不是a,e,i,o,u中的某个字符
//验证str是否a-z的任何一个小写字符开头,后跟ad
//验证str是否以a-d或者m-p之间某个字符开头,后跟ad
Scanner sc = new Scanner(System.in);
String redex="h[aeiou]d";
String redex1="h[^aeiou]d";
String redex2="[a-z]ad";
String redex3="[a-dm-p]ad";
while (true) {
System.out.println("请输入一个字符串:");
String str=sc.next();
System.out.println(str.matches(redex));
System.out.println(str.matches(redex1));
System.out.println(str.matches(redex2));
System.out.println(str.matches(redex3));
}
五、分组
分组语法 | 含义 |
---|---|
() | 将一系列操作作为一个整体来理解 |
//1.需求:按照如下要求,使用正则表达式,完成"DG8FV-B9TKY-FRT9J-99899-XPQ4G"序列号字符串内容的验证
//2.验证小数:要求匹配:3、3.0、3.14、+3.14、-3.0
//DG8FV-B9TKY-FRT9J-99899-XPQ4G
//初级思路:[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}
//错误思路:[[A-Z0-9]{5}-]{4}[A-Z0-9]{5}
String regex="([A-Z0-9]{5}-){4}[A-Z0-9]{5}";
String s="DG8FV-B9TKY-FRT9J-99899-XPQ4G";
System.out.println(s.matches(regex));
System.out.println("----------------------");
//3、3.0、3.14、+3.14、-3.0
String regex1="[+-]?3(\\.\\d+)?";
System.out.println("3".matches(regex1));
System.out.println("+3".matches(regex1));
System.out.println("-3.0".matches(regex1));
System.out.println("3..".matches(regex1));
System.out.println("3.20".matches(regex1));
System.out.println("+3.3.5".matches(regex1));
六、实例
需求1: 使用String中的split方法,将字符串"18 4 567 99 56"以间隔进行分割。
需求2: 使用String中的replaceALL方法,将"fdk432fdk2k2435447ik5L31324"中的数字使用*进行替换。
//一个或者多个空格为切割条件
String regex=" +";
String[] arr="18 4 567 99 56".split(regex);
System.out.println(Arrays.toString(arr));
System.out.println("--------------------");
//应用场景:游戏中的聊天说脏话
String regex1="\\d";
String s="fdk432fdk2k2435447ik5L31324".replaceAll(regex1,"*");
System.out.println(s);
String regex2="\\d+";
String s1="fdk432fdk2k2435447ik5L31324".replaceAll(regex2,"**");
System.out.println(s1);
七、总结
普通方法和正则表达式的区别所在,实例为:
需求:
分别使用if语句和正则表达式,对用户输入一个qq号码做验证操作。要求同时符合以下三个规则才算通过验证。
规则①:qq号码必须是5-15位长度
规则②:而且首位不能为0
规则③:而且必须全是数字
方法一:
public static void method1() {
String qq="3179640391";
//注意逻辑上的问题,一开始应该为true。即一开始用户输入QQ号的时候就认为符合规则,
// 再去根据条件判断是否满足规则,不满足就直接验证不通过。
boolean flag=true;
//如果不满足条件就变成false
if (!(qq.length()>=5&&qq.length()<=15)){
flag=false;
}
//如果不满足条件就变成false
if (!(flag==true&&qq.charAt(0)!='0')){
flag=false;
}
//如果不满足条件就变成false
for (int i = 0; i < qq.length(); i++) {
if (!(qq.charAt(i)>='0'&&qq.charAt(i)<='9')){
flag=false;
//有一个数字不符合规则立刻结束验证
break;
}
}
if (flag==true){
System.out.println(qq+"验证通过~");
}
}
方法二:
public static void method2(){
//规则1:qq号码必须是5-15位长度
//规则2:而且首位不能为0
//规则3:而且必须全是数字
String qq="3172798717";
boolean flag=false;
if (qq.length()>=5&&qq.length()<=15){
if (qq.charAt(0)!='0'){
for (int i = 0; i < qq.length(); i++) {
if (!(qq.charAt(i)>='0'&&qq.charAt(i)<='9')){
flag=false;
break;
}else {
flag=true;
}
}
}else {
flag=false;
}
}else {
flag=false;
}
if (flag==true) {
System.out.println(qq+"验证通过~");
}
}
测试代码:
public static void main(String[] args) {
//分别使用if语句和正则表达式,对用户输入一个qq号码做验证操作。要求同时符合以下三个规则才算通过验证
//规则1:qq号码必须是5-15位长度
//规则2:而且首位不能为0
//规则3:而且必须全是数字
//method1();
method2();
//正则表达式
String qq="3179640391";
String regex="[1-9][0-9]{4,14}";
//System.out.println(qq.matches(regex));
}