正则表达式Regex

作用:

  •         校验字符串是否满足规则
  •         在一段文本中查找满足要求的内容

字符类(只匹配一个字符

正则表达式说明
[abc]只能是a,b,或c
[^abc]除了a,b,c之外的任何字符
[a-zA-Z]a到z A到Z,包括(范围)
[a-d[m-p]]a到d,或m到p
[a-z&&[def]]a-z和非bc的交集,为d,e,f
[a-z&&[^bc]]a-z和非bc的交集(等同于[ad-z])
[a-z&&[^m-p]] a到z和除了m到p的交集(等同于[a-lq-z])

package Regex正则表达式;

public class demo2 {
    public static void main(String[] args) {
        //只能是 a b c (一个字符) [abc]
        System.out.println("a".matches("[abc]"));//ture
        System.out.println("z".matches("[abc]"));//false
        System.out.println("ab".matches("[abc]"));//false
        System.out.println("ab".matches("[abc][abc]"));//true

        //不能出现 a b c  [^abc]
        System.out.println("a".matches("[^abc]"));//false
        System.out.println("e".matches("[^abc]"));//true

        //a到z A到Z(包括头尾的范围) [a-zA-Z]
        System.out.println("a".matches("[a-zA-Z]"));//true
        System.out.println("z".matches("[a-zA-Z]"));//true

        //a到d或 m到p  [a-d[m-p]]
        System.out.println("a".matches("[a-d[m-p]]"));//true
        System.out.println("m".matches("[a-d[m-p]]"));//true

        //a到z或和def交集 [a-z&&[def]] 为 d e f
        //细节:如果要求两个范围的交集,那么需要写符号&&
        // 如果写成了一个8,那么此时&表示就不是交集了,而是一个简简单单的&符号
        System.out.println("a".matches("[a-z&&[def]]"));//false
        System.out.println("d".matches("[a-z&&[def]]"));//true

        //a到z或和非bc交集  [a-z&&[^bc]] (等同于[ad-z])
        System.out.println("a".matches("[a-z&&[^bc]]"));//true
        System.out.println("b".matches("[a-z&&[^bc]]"));//false

        //a到z或和非m到p交集  [a-z&&[^m-p]] (等同于[a-lq-z])
        System.out.println("a".matches(" [a-z&&[^m-p]] "));//true
        System.out.println("m".matches(" [a-z&&[^m-p]] "));//false

    }
}

预定义字符(只匹配一个字符

正则表达式说明
.任何字符(除了\n)
\d一个数字:[0-9]
\D非数字:[^0-9]
\s一个空白字符:[\t\n\x0B\f\r]
\S非空白字符:[^\s]
\w[a-zA-Z_0-9]英文、数字、下划线
\W[^\w]一个非单词字符

数量词

正则表达式说明
X?X,一次或者0次
X*X,零次或多次
X+X,一次或多次
X{n]X,正好n次
X{r, }X,至少n次
X{n,m}X,至少n次但不超过m次
package Regex正则表达式;

public class demo3 {
    public static void main(String[] args) {
        //. 表示任意一个字符
        System.out.println("你".matches(".."));//false
        System.out.println("你好".matches(".."));//false

        // \d 只能是任意的一位数字
        //     \ 为转义字符   简单记忆:两个\表示一个\
        System.out.println("你好".matches("\\d"));//false
        System.out.println("333".matches("\\d"));//false
        System.out.println("2".matches("\\d"));//true


        //   \\w(小写)只能是一位单词字符[a-zA-Z_0-9]
        System.out.println("21".matches("\\w"));//false
        System.out.println("a".matches("\\w"));//true
        System.out.println("你".matches("\\w"));//true
        System.out.println("_".matches("\\w"));//true

        //非单词字符 \\W(大写)
        System.out.println("你".matches("\\W"));//false

        //以上只能校验单个字符================

        //必须是数字 、字母、下划线 至少是6位
        System.out.println("244f".matches("\\w{6,}"));//false
        System.out.println("2442ffffff".matches("\\w{6,}"));//true


        //必须是数字和字符 必须是四位
        System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
        System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));//false
        System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
        System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false




    }
}

 其余小细节:

符号含义举例
[ ]里面的内容出现一次[0-9]
( )分组a(bc)+
&&交集,不能写单&[a-z&&m-p]
|写在方括号外面表示并集[a-zA-Z0-9]  x|X
?0次或1次\\d?
*0次或多次\\d*   (abc*)
+1次或多次\\d+      (abc)+
{ }具体次数a{7}   \\d{7,19}
(?i)忽略后面字符的大小写(?i)abc
a((?i)b)c只忽略b的大小写a((?i)b)c

编写的小方法:

第一步:按照正确的数据进行拆分
第二步:找每一部分的规律,并编写正则表达式
第三步:把每一部分的正则拼接在一起,就是最终的结果
书写的时候:从左到右去书写。

 例子一:

package Regex正则表达式;

public class text1 {
    public static void main(String[] args) {

        //方法:
        //拿着正确的数据,从左到右依次去写

        //分成三部分:
        //第一部分:1 表示手机号码只能以1开头
        //第二部分:[3-9]表示手机号码第二位只能是3-9之间的
        // 第三部分:\\d{9}表示任意数字可以出现9次,也只能出现9次


        String regex1="1[0-9]\\d{9}";
        //String regex1="1[0-9][0-9]{9}";
        System.out.println("10016332218".matches(regex1));
        System.out.println("100163322180".matches(regex1));
        System.out.println("---------------------------------");
        //验证座机号码
        //020-2324242 02122442 027-42424 0712-3242434
        //思路:
        //在书写座机号正则的时候需要把正确的数据分为三部分
        //一:区号 0\\d{2,3}
        //   0:表示区号一定是以0开头的
        //   \\d{2,3}:表示区号从第二位开始可以是任意的数字,可以出现2到3次
        //二:  -?表示次数,0次或一次
        //三:号码号码的第一位也不能以0开头,从第二位开始可以是任意的数字,号码的总长度:5-10位(自己定义的)
        //但要写{4,9}的原因是前面的[1-9]也算一位
        String regex2="0\\d{2,3}-?[1-9]\\d{4,9}";
        System.out.println("020-2324242".matches(regex2));
        System.out.println("02122442".matches(regex2));
        System.out.println("027-42424".matches(regex2));
        System.out.println("0712-3242434".matches(regex2));
        System.out.println("=========================================");
        邮箱号码
        //3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
        //思路:
        //在书写邮箱号码正则的时候需要把正确的数据分为二部分
        // 第一部分:@的左边\\w+
        //     任意的字母数字下划线,至少出现一次就可以了
        // 第二部分:@ 只能出现一次
        //第三部分:
        //3.1       .的左边[\\w&&[^_]]{2,6}
        //        任意的字母加数字,总共出现2-6次(此时不能出现下划线)
        //3.2       .   \\. (用转义字符)
        //          大写字母,小写字母都可以,只能出现2-3次[a-zA-Z]{2,3}
        // 3.3我们可以把3.2和3.3看成一组,这一组可以出现1次或者两次
        //dlei0009@pci.com.cn  指.com.cn 这种情况
        String regex3="\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
        System.out.println("3232323@qq.com".matches(regex3));
        System.out.println("dlei0009@pci.com.cn".matches(regex3));

        //可以用插件any-rule
    }
}

 例子二:

package Regex正则表达式;

public class text2 {
    public static void main(String[] args) {
       // 需求
        //请编写正则表达式验证用户名是否满足要求。
        //要求:大小写字母,数字,下划线一共4-16位请编写正则表达式验证身份证号码是否满足要求
        //简单要求:18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x
        // 复杂要求:按照身份证号码的格式严格要求。


        //请编写正则表达式验证用户名是否满足要求。
        //要求:大小写字母,数字,下划线一共4-16位
        String regex1="\\w{4,16}";


        //简单要求:
        // 18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x
        String regex2="[1-9]\\d{16}(\\d|X|x)";
        //[]里面的内容任意出现一次
        String regex3="[1-9]\\d{16}[\\dXx]";
        //继续修改
        String regex7="[1-9]\\d{16}(\\d|(?i)x)";
        System.out.println("----------------");
        //忽略大小写
        //在匹配的时候忽略abc的大小写
        String regex4="(?i)abc";
        System.out.println("----------------");
        System.out.println("abc".matches(regex4));
        System.out.println("aBC".matches(regex4));
        System.out.println("ABC".matches(regex4));
        //在匹配的时候忽略bc的大小写
        String regex5="a(?i)bc";
        //在匹配的时候忽略b的大小写 a((?i)b)c  指ac要完全一样,c可以不区分大小写
        String regex6="a((?i)b)c";

        System.out.println("---------------------------");
        //编写正则的小心得:
        //第一步:按照正确的数据进行拆分
        //第二步:找每一部分的规律,并编写正则表达式
        //第三步:把每一部分的正则拼接在一起,就是最终的结果
        //书写的时候:从左到右去书写。

        // 复杂要求:按照身份证号码的格式严格要求。

        //4188011993 02 28 457X
        //前面6位:省份,市区,派出所等信息,第一位不能是8,后面5位是任意数字
        //[1-9]\\d{5}
        //年的前半段:18 19 20
        //          (18|19|20)
        //年的后半段:任意数字出现两次
        //          \\d{2}
        //月份:   01~09 10~12
        //      (0[1-9]|1[0-2])
        //日期: 01~31       01~09 10~19 20~29 30~31
        //          方法一:(0[1-9]|1[0-9]|2[0-9]|3[0-1])
        //          方法二:0[1-9]|[12]\\d|3[01]
        //后面四位:任意数字出现3次 最后一位可以是数字也可以是大写X或者小写x
        //      方法一:\\d{3}(?i)x
        //      方法二:\\d{3}[\\dXx]
        String regex8="[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";
        System.out.println("41880119930228457X".matches(regex8));

        String regex10="[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]";
        System.out.println("41880119930228457X".matches(regex10));
    }
}

 

注意:

其余的正则表达式可以在

[Java参考文档].JDK_API_1_6_zh_CN.CHM    

方法:  

  • 查找Pattern类
  • 先查找String 类 然后找matches方法

简单方法嘻嘻:

直接在IntelliJ IDEA 2023.1 安装一个插件any-rule(前提是要懂得修改哈)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值