2022.0914学习Java笔记之正则表达式

正则表达式

  高散数学是正则的理论基础,有想弄明白的,可以去研究一下。正则是一种简化的验证手段

范例:要求判断一个字符串是否由数字组成。

  • 思路:将字符串变为字符数组,而后每个字符进行依次判断。
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "12a3";
        System.out.println(isNumber(num));
    }
    public static boolean isNumber(String str){
        char[] data = str.toCharArray();
        for(int x = 0;x<data.length;x++){
            if (data[x] >'9' || data[x] < '0'){
                return false;
            }
        }
        return true;
    }
}

 结果:false

 如果复杂一点,这样做就显然不划算了

范例:利用正则表达式

package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "12a3";
        System.out.println(num.matches("\\d+"));
    }
}

  发现如果在验证操作上使用正则符号进行匹配,则代码量可以非常少,而“”\\d+””就是正则表达式。

  表达式最早是在Liunx下发展起来的,在JDK1.4之前,如果需要使用到正则那么要通过apache下载正则应用包。而从JDK1.4开始,Java正式支持了正则的开发,同时给出了一个java.util.regex开发包,提供正则操作类。
  但是需要注意的是,在java.util.regex包里面只提供有两个核心类:

  • java.util.regex.Pattem:正则标记编译类;
  • java.util.regex.Matcher:正则匹配操作;。

而在开发之中很少去直接使用以上的两个类,一般都使用Sring类完成,因为从JDK1.4之后开始,String类之中有了正则的支持,同时提供了以下支持正则的开发方法。

No方法名称类型描述
1public boolean matches(String regex)普通正则验证
2public String replaceAll(String regex, String replacement)普通全部替换
3public String replaceFirst(String regex, String replacement)普通替换首个
4public String[] split(String regex)普通全拆分
5public String[] split(String regex, int limit)普通部分拆分

正则符号(

要使用正则,就要知道怎么使用一系列的正则匹配符号,而所有的正则匹配符号都在Java.util.regex.Pattern类提供

1、表示单个字符(每出现一个只表示一位)。

  • x:表示只能由x组成;
  • \\:表示转义字符“\”;
  • \t:匹配“tab”键;
  • \n:匹配换行;

2、 表示字符的选用范围

  • [abc]:表示可能是a、b、c中的任意一个;
  • abc]:表示不是a、b、c中的任意一个;。
  • [a-zA-Z]:表示任意的一位字母,可能是大写或小写;
  • [0-9]:表示任意的一位数字;

3、简化表达式(每出现一个只表示一位)。

  • ·:表示任意的一位字符;
  • \d:表示是一位数字,相当于“[0-9]”;
  • \D:表示不是一位数字,相当于“[^0-9]”;
  • \s:表示是任意的一位空格;
  • \S:表示不是任意的一位空格;
  • \w:表示是大小写字母、数字、_中的任意一位,相当于“[a-zA-Z0-9_]”;
  • \W:表示不使大小写字母、数字、中的任意一位,相当于“[a-zA-Z0-9_]”; 

4、边界匹配

  • ^:写在正则之前,表示正则开始;
  • $:写在正则最后,表示正则结束;

5、 数量表示:如果没有数量,每一个出现的标记只能表示一位。

  • 正则?:表示此正则规范只能够出现0次或1次;
  • 正则*:表示此正则出现0次、1次或多次;
  • 正则+:表示此正则出现1次或多次;
  • 正则{n}:表示此正则出现正好n次;
  • 正则{n}:表示此正则出现n次以上;
  • 正则{n,m}:表示此正则出现n~m次; 

6、 逻辑操作符

  • 正则X正则Y:表示正则X判断后执行正则Y;
  • 正则X|正则Y:表示两个正则二选一;
  • (正则):包含多个正则,成为一组; 

通过String类来操作正则

正则的所有操作方法都是通过String类完成,所以下面通过String类操作正则

范例:字符串替换

package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "jibiy%&*()nh";
        String regex = "[^a-zA-Z]";
        System.out.println(num.replaceAll(regex,""));
    }
}

 结果:jibiynh

范例:字符串拆分 

package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "aw123449dj9937472xsw";
        String regex = "\\d+";
        String result[] = num.split(regex);
        for(int x = 0; x < result.length; x++) {
            System.out.println(result[x]);
        }
    }
}

结果:aw
           dj
           xsw

 范例:用户名由字母、数字、_组成,要求其范围在6~15位

  • 正则:[a-zA-Z0-9_]=\w;
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "aw123";
        String regex = "\\w{6,15}";
        System.out.println(num.matches(regex));
    }
}

结果:false

范例:学校的学生成绩要按照“姓名:年龄:生日:成绩”,那么这样的数据可以出现多条,例如“SMITH:20:2000-09-21:90.9” 等等,多条记录之间要求使用“|”隔开

那么下面首先要进行问题拆分,因为这个验证包含很多小规则

  • 规则一:验证姓名,不设长度限制(一位或多位,用+表示)
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "SMITH";
        String regex = "[a-zA-Z]+";
        System.out.println(num.matches(regex));
    }
}
  • 规则二:验证年龄,年龄是一个数字,长度范围1~3位
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "19";
        String regex = "\\d{1,3}";
        System.out.println(num.matches(regex));
    }
}
  • 规则三:验证生日,生日是数字组合
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "1999-09-21";
        String regex = "\\d{4}-\\d{2}-\\d{2}";
        System.out.println(num.matches(regex));
    }
}
  • 规则四:验证分数,分数有小数,成绩最多三位,小数最多两位
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "99.21";
        String regex = "\\d{1,3}(\\.\\d{1,2})?";
        System.out.println(num.matches(regex));
    }
}
  • 整合验证

 

package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  num = "SMITH:19:1999-09-21:99.21";
        String regex = "[a-zA-Z]+:\\d{1,3}:\\d{4}-\\d{2}-\\d{2}:\\d{1,3}(\\.\\d{1,2})?";
        System.out.println(num.matches(regex));
    }
}
  • 满足多组信息操作
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  str = "SMITH:19:1999-09-21:99.21|ALLEN:27:1991-11-23:100|TONY:18:2000-03-15:105.8";
        String regex = "([a-zA-Z]+:\\d{1,3}:\\d{4}-\\d{2}-\\d{2}:\\d{1,3}(\\.\\d{1,2})?\\|?)+";
        System.out.println(str.matches(regex));
    }
}

范例:验证ermail地址,email地址的验证规则如下

  • 用户名只能够以字母、_、数字、组成;
  • 用户名只能够以字母开头
  • 用户名的长度要求在6~20位之间
  • 域名只能是:com、.cn、net、.com.cn、.net.cn、.edu、.gov;
package cn.mldn.demo;

public class TextDemo {
    public static void main(String[] args) throws Exception {
        String  str = "mldn.hello156@163.com.cn";
        String regex = "[a-zA-Z][a-zA-Z0-9_\\.]{5,19}"+"@[a-zA-Z-0-9]+\\."+"(com|cn|net|gov|com\\.cn|net\\.cn)";
        System.out.println(str.matches(regex));
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值