一、正则表达式
作用:检查输入的格式是否正确
应用场景:登陆、注册、输入邮箱及手机号等
例如:邮箱的格式,手机号的格式,身份证的格式...我们都可以用正则表达式来约束用户输入的数据。
比如说以后需要写一个手机号、邮箱的格式的正则表达式的话,直接去百度搜就好了。不需要记住,知道怎么用就好了。
1. 基本的正则表达式:
[a,b,c] 表示的是这个字符可以是a 或 b 或 c 的任意的一个字符
[^abc] 表示的是除了a或b或c之外的任意一个字符都可以。
[a-zA-Z0-9] 表示的是可以写一个26个小写字母或大写字母或0-9的数字。
[a-z&&[^bc]] 表示的是26个小写字母,除了bc不可以写,其它都可以写。(可以写..并且不能写...)
2. 预定字符集
限制一些特殊符号的用法
\w 表示的是单个词的字符----其实就是[a-zA-Z0-9]
其实就是三个字母的大小写,不需要记。
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;//返回对象
}
}