Java lecture 12 正则表达式、预定字符集

本文介绍了正则表达式的基础概念,如字符集、数量词、分组的应用,以及如何用于验证邮箱、手机号和身份证格式。同时,讲解了正则表达式的split和replaceAll操作,并提到了单例设计模式在减少内存开销中的作用,介绍了懒汉式和饿汉式的区别。
摘要由CSDN通过智能技术生成

一、正则表达式

作用:检查输入的格式是否正确

应用场景:登陆、注册、输入邮箱及手机号等

例如:邮箱的格式,手机号的格式,身份证的格式...我们都可以用正则表达式来约束用户输入的数据。

比如说以后需要写一个手机号、邮箱的格式的正则表达式的话,直接去百度搜就好了。不需要记住,知道怎么用就好了。

1. 基本的正则表达式:

[] 表示的是一个字符的意思

[a,b,c] 表示的是这个字符可以是a 或 b 或 c 的任意的一个字符

[^abc] 表示的是除了a或b或c之外的任意一个字符都可以。

[a-z] 表示的是可以写一个26个小写字母中的任意一个。

[a-zA-Z0-9] 表示的是可以写一个26个小写字母或大写字母或0-9的数字。

[a-z&&[^bc]]  表示的是26个小写字母,除了bc不可以写,其它都可以写。(可以写..并且不能写...)

2. 预定字符集

限制一些特殊符号的用法

. 表示任意一个字符

\d 表示可以写任意一个数字字符 ---其实就是0-9

\w 表示的是单个词的字符----其实就是[a-zA-Z0-9]

\s 表示的是一个空白字符

\D 表示非数字 字符

\W 表示非字母 数字等字符

\S 表示的是非空白字符

其实就是三个字母的大小写,不需要记。

3. 数量词

限制能写几个字符,加在字符的后面

?   表示可以写0~1个次(要么不写,要么只能写一次)
    例如:[abc]?  表示可以写一个a 或 b 或 c,不能写其它内容
+   代表至少出现1次以上,没有上限
    例如: [abc]+  表示至少写一个a 或 b 或 c,可以出现多次,不能写其它内容
*   表示可以写任意次,一次不写也可以
-------------------------------
限制次数:
        [abc]{3}   代表写3个字符
        [abc]{3,5} 代表最多只能写3个 最多只能写5个
        [abc]{3,}  代表至少写3个没有上限。
    

4.分组

(abc){3}  表示可以视为abc为一组  至少出现3组的意思
eg. abcabcabc
(abc|def){3} 表示可以视为abc 或 def为一组  至少出现3组。    
eg. defabcdef

5. 邮箱的表达式使用:

一般邮箱包括三个:“用户名+@+域名”

那我们看,用户名一般允许:[a-zA-Z0-9_]

我们要求必须从这个范围输入,但是又不允许不输入。

所以用+,也就是[a-zA-Z0-9_]+

域名的话[a-zA-Z0-9]+ 

所以拼起来之后,代码就是:

 String email ="bjzhangpeng@tedu.com.cn";//邮箱    s.next();
        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        //matches 方法 是通过传入的正则表达式的内容 来匹配当前String对象中的字符串是否匹配成功
        if( email.matches(regex)){//判断当前email中的格式是否 匹配正则的格式。
            System.out.println("邮箱格式正确");
        }else
        {
            System.out.println("邮箱格式有误");
        }

所以考虑正则表达式的时候,可以拆成几个部份去想,最后再拼在一起。

注意,在这里的代码里,我们把.[a-zA-Z]括起来,因为有些域名可能是.com.cn,有多个的那种。在.前面加了两个\\,因为.本来是预定字符集里的(表示任意特殊字符),为了让这里的.失去这个功能,加了两个\进行转义。

6. 身份证的表达式使用:

 void regex02(){
         身份证号码: 15  或  18位
          123456789012345      ---15位
          123456789012345678   ---18位
          12345678901234567x
         12345678901234567X
           \d{15}   表示至少写15个数字
           \d{18}   表示至少写18个数字
           \d{17}[\dxX]  表示前面是17个数字 后面一位 可以是一个数字或 一个x 或 X
           正则的格式: \d{15}|\d{17}[\dxX]
           java中\是有特殊含义 代表转义 所以在写入时 需要加 \\才可以
         
        String regex = "\\d{15}|\\d{17}[\\dxX]";
        Scanner s = new Scanner(System.in);
        String line =  s.next();//接收用户输入的内容
        if(line.matches(regex)){
            System.out.println("身份证号码正确");
        }else {
            System.out.println("身份证号码格式错误");
        }
    }

注意,中间用一个|用来表示正则表达式里的或者。并且这里的\d前面加了一个\,为了转义。

7. 座机号码的正则使用演示: 

 /**
         *  1234567  七位电话
         *  12345678 八位电话
         *  010-1234567 区号三位 - 七位电话
         *  010-12345678 区号三位 - 八位电话
         *  0101-1234567 区号四位 - 七位电话
         *  0101-12345678 区号四位 - 八位电话
         *  (010)1234567  (区号三位)七位电话
         *  (010)12345678 (区号三位)八位电话
         *  (0101)1234567 (区号四位)七位电话
         *  (0101)12345678 (区号四位)八位电话
         *  \d{7,8}  表示是电话位数
         *  区号可以0次或1次:    ?\d{7,8}
         *  区号的两种情况: \d{3,4}-|(\d{3,4})
         *  格式:    (\d{3,4}-|(\d{3,4}))?\d{7,8}
         *///?   表示可以写0~1个次     \d表示数字
        //用正则表达式来进行格式的编写座机的电话情况   并测试。
        //() 在正则中表示的一组的意思  但是如果像表示单纯的括号 需转义
        Scanner s = new Scanner(System.in);
        String line = s.next();
        String regex = "(\\d{3,4}-|\\(\\d{3,4}\\))?\\d{7,8}";
        if(line.matches(regex)){
            System.out.println("电话格式正确");
        }else {
            System.out.println("电话格式有误");
        }

注意,这里要对括号进行转义,因为括号在正则中表示一组。

二、正则表达式的使用方式:

split

1. 切割(分割):

例子:

        String str = "abc123def456ghi789";
        //切割 ,分割 以0-9的数据为分割点。
        //split() 传入正则表达式,根据正则的格式来进行切割
        String[] data = str.split("[0-9]+");//遇到当前字符串对象中出现1或多次以上的数值来作为切割点
        for (int i = 0; i < data.length; i++) {
            System.out.println(data[i]);
        }
        String str1 = "a,b,c,d,e,f";
        String[] data1 = str1.split(",");//也可以传递符号来作为切割点.
        for (int i = 0; i < data1.length; i++) {
            System.out.println(data1[i]);
        }

2. 替换:

replaceAll

比如说把用户输入的一些聊天里的敏感词,全部替换掉。

        
        String regex = "(sb|nc|wr|dsb|tmd|qnmd)";
        String message = "qnmd!你这个dsb,你怎么这么nc!";
        //replaceAll();  1,需要传入匹配的正则格式  2.若匹配时 需要替换的内容
        message = message.replaceAll(regex, "小可爱"); //网络和谐用语.
        System.out.println(message);
        //----------------------------------
        String str = "abc123def456ghi789";
        str = str.replaceAll("[0-9]+", "NUMBER");
        System.out.println(str);
        //replaceAll 替换的功能 支持正则
        //replace  替换的功能 不支持
        //------------------------------
        String str1 = "abc123def123";
        str1 = str1.replace("123","***");
        System.out.println(str1);

三、设计模式

市面上常用的就23种.

设计模式:尽可能的遵循并实现开发设计原则,从而解决代码的复用,增加可维护性的目的.

设计模式指的是软件设计过程中常见的问题通用的解决方案.

注意:设计模式虽然灵活性高,但影响性能.

常用的设计模式:

1. 单例设计模式(Singleton):

一般就是把某个类设计来当工具用,才需要。

主要作用:保证在Java程序中,一个类只有一个实例存在.

好处: 比如当有一个类被频繁创建时,且这个类具有唯一性(工具).那么如果频繁创建对象会造成内存的开销和资源浪费. 如果这个类使用单例设计模式,就能保证这个类只会有一个对象.

如何做单例设计模式:

饿汉式:

 *        不管有没有人调用我,我自己就创建好了.
 *        1. 构造方法私有化  外部不能写创建对象的语法
 *        2. 在类中自己创建对象
 *        3. 对外提供可以访问的对象

package singletondemo;
​
/**
 * 单例模式--- 饿汉式的使用
 */
public class HungrySingletonDemo {
    public static void main(String[] args) {
//        HungrySingleton hungry = new HungrySingleton();
        HungrySingleton.getInstance().工具();
​
    }
}
/** 饿汉式:   开发时 也可能会经常使用
 *        不管有没有人调用我,我自己就创建好了.
 *        1.构造方法私有化  外部不能写创建对象的语法
 *        2.在类中自己创建对象
 *        3.对外提供可以访问的对象
 */
class HungrySingleton {//类
​
    private static HungrySingleton singleton = new HungrySingleton();//2.在类中自己创建对象
    private HungrySingleton() { //1.构造方法私有化  外部不能写创建对象的语法
    }
    public static HungrySingleton getInstance(){ //3.对外提供可以访问的对象
        return singleton;
    }
    public static void 工具() {
        System.out.prntln("工具被使用了!!!");
    }
}

懒汉式(面试的时候会问到):

饿汉式的单例是在第一时间就会创建对象.

而懒汉式是在首次被调用时才去做的创建类实例的操作.

优点:第一次使用时,才会创建对象的操作 避免内存浪费.

缺点:存在线程安全(第二阶段会讲).

package singletondemo;
​
​
/**
 * 懒汉式  ----面试有可能会问到.
 */
public class LazySingletonDemo {
    public static void main(String[] args) {
        System.out.println(LazySingleton.getInstance());
    }
}
class LazySingleton{//类
​
    private static LazySingleton singleton; //2.只是声明一个静态 LazySingleton类型的变量
    private LazySingleton(){}//1,私有化构造方法
    public static LazySingleton getInstance(){ //对外提供可以获取对象的方法
        if(singleton == null){//判断当前singleton 等不等于null
            singleton = new LazySingleton();//若为null 则创建对象
        }
        return singleton;//返回对象
    }
}
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq030928

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值