Regular Expression
校验给定的字符串是否满足某种格式要求(合同)
优点:能够大大的简化代码量;
缺点:阅读性比较差,不能够精确到具体错误、只能测验出有误
用下面三个哪一个 要看最终要什么样的数据类型
一、匹配
每种校验使用两种方法来做(正则表达式、传统方法)
1、手机号码校验
普通写法
import java.util.Scanner;
public class Regex1 {
public static void main(String[] args) {
/**
* 手机号格式:<br>
* 159xxx 13xxx 18xxx 17xxx<br>
* 1、必须为11位的纯数字<br>
* 2、第1个字符必须是1<br>
* 3、第2个字符必须是3、5、7、8
*/
Scanner input = new Scanner(System.in);
System.out.print("请输入一个手机号码:");
String phone = input.next();
// 1.计算字符串的长度
int len = phone.length();
if (len == 11) {// 满足长度11位
// 2、将字符串转化成字符数组
char[] chs = phone.toCharArray();
// 3、判断第1个字符是否是1
if (chs[0] == '1') {// 满足第1个字符是1
// 4、判断第2个字符是否是3/5/7/8
if (chs[1] == '3' || chs[1] == '5' || chs[1] == '7' || chs[1] == '8') {
// 5、判断手机号码后9位是否是数字
boolean flag = true;// 手机号码11位都是数字
for (int i = 0; i < chs.length; i++) {
if (!('0' <= chs[i] && chs[i] <= '9')) {// 当前不是数字
flag = false;
break;
}
}
if (flag) {
System.out.println("亲,手机号码格式正确!!!");
} else {
System.out.println("亲,手机号码必须全部为数字");
}
} else {
System.out.println("亲,你手机号码有误(第2个字母不正确)");
}
} else {
System.out.println("亲,您输入的手机号码有误(第1个字符必须为1)");
}
} else {
System.out.println("亲,您输入的手机号码长度有误!");
}
}
}
使用正则表达式
import java.util.Scanner;
public class Regex2 {
public static void main(String[] args) {
/**
* 手机号格式:<br>
* 159xxx 13xxx 18xxx 17xxx<br>
* 1、必须为11位的纯数字<br>
* 2、第1个字符必须是1<br>
* 3、第2个字符必须是3、5、7、8
*/
// 字符串中只能有一个字符,并且这个字符只能是1
String regex1 = "[1]";// 正则表达式
String phone1 = "12";// 键盘录入
boolean flag1 = phone1.matches(regex1);
// System.out.println("flag1=" + flag1);
// 给定的字符串只能有1个字符,并且这个字符只能为3/5/7/8
String regex2 = "[3578]";// 正则表达式
String phone2 = "2";// 键盘录入
boolean flag2 = phone2.matches(regex2);
// System.out.println("flag2=" + flag2);
String regex3 = "[1][3578]";// 正则表达式
String phone3 = "1";// 键盘录入
boolean flag3 = phone3.matches(regex3);
// System.out.println("flag3=" + flag3);
// String regex4 = "[0-9]";// 正则表达式
String regex4 = "[a-zA-Z0-9]";// 正则表达式
String phone4 = "N";// 键盘录入
boolean flag4 = phone4.matches(regex4);
// System.out.println("flag4=" + flag4);
String regex5 = "[0-9]{9}";// 正则表达式
String phone5 = "12345a789";// 键盘录入
boolean flag5 = phone5.matches(regex5);
// System.out.println("flag5=" + flag5);
Scanner input = new Scanner(System.in);
System.out.print("请您输入手机号码:");
String phone = input.next();
String regex = "[1][3578][0-9]{9}";
boolean flag = phone.matches(regex);
System.out.println(flag ? "手机号格式正确" : "手机号格式有误,请您重新输入!!!");
}
}
2、QQ号校验
校验QQ号码:
(1)、长度为5-12位
(2)、必须为纯数字
(3)、第一个字母不能够为0
import java.util.Scanner;
public class Regex3 {
public static void main(String[] args) {
/**
* QQ号码规则:<br>
* 1、必须全部为数字<br>
* 2、长度必须在5-12位之间
*/
/**
* 数量词一:<br>
* X{n}:X出现的次数恰好为n次<br>
* X{n,}:X出现的次数>=n<br>
* X{n,m}:n<=X出现的次数<=m
*/
String qq = "1234567891234";
String regex = "[0-9]{5,12}";// 5<=X<=12
boolean flag = qq.matches(regex);
// System.out.println("flag=" + flag);
/**
* 数量词二:<br>
* X*:X出现的次数>=0<br> 等价于 X{0,}
* X+: X出现的次数>=1<br>
* X?: X出现的次数<=1次,发生或不发生
*/
boolean flag1 = "01".matches("[0-9]?");
// System.out.println("flag1=" + flag1);
boolean flag2 = "".matches("[0-9]+");
// System.out.println("flag2=" + flag2);
boolean flag3 = "123".matches("[0-9]*");
System.out.println("flag3=" + flag3);
}
}
3、身份证号校验
校验身份证:
(1)、长度为18位
(2)、前面17位必须为纯数字
(3)、最后一位可以为X,也可以为数字
(4)、不用校验出生日期等
import java.util.Scanner;
public class Regex4 {
public static void main(String[] args) {
// 校验身份证:1、总共18位字符 2、前面17位必须为数字,最后一位既可以为数字也可以为X
Scanner input = new Scanner(System.in);
System.out.print("请输入您的身份证号:");
String idcard = input.next();
boolean flag1 = idcard.matches("[0-9]{17}[0-9X]");
System.out.println("flag1=" + flag1);
}
}
public class Regex5 {
public static void main(String[] args) {
/**
* 身份证号规则:<br>
* 1、位数可以为15位、也可以为18位<br>
* 2、如果长度为15位的身份证号,必须全部为数字<br>
* 3、如果长度为18位的身份证号,前17位必须为数字,最后一位可以为数字或者字母
*/
Scanner input = new Scanner(System.in);
System.out.print("请输入您的身份证号:");
String idcard = input.next();
boolean flag1 = idcard.matches("[0-9]{15}([0-9]{2}[0-9X])?");
System.out.println("flag1=" + flag1);
}
}
public class Regex6 {
public static void main(String[] args) {
/**
* 身份证号规则:<br>
* 1、位数可以为15位、也可以为18位<br>
* 2、如果长度为15位的身份证号,必须全部为数字<br>
* 3、如果长度为18位的身份证号,前17位必须为数字,最后一位可以为数字或者字母
*/
/**
* 预定义字符:<br>
* [0-9]:给定的字符串只能有一个字符,并且此字符只能是数字===>\d<br>
* [0-9a-zA-Z_]:单词字符====>\w
*/
Scanner input = new Scanner(System.in);
System.out.print("请输入您的身份证号:");
String idcard = input.next();
boolean flag1 = idcard.matches("\\d{15}(\\d{2}[0-9X])?");
System.out.println("flag1=" + flag1);
System.out.println("\\");
}
}
Java的特点:“\\”代表现实中“\”(反,换行符等),“/”无影响(正,HTML).
4、邮箱
使用了RegexTool工具帮助查询正则表达式
import java.util.Scanner;
public class Regex7 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入姓名:");
String username = input.next();
boolean flag1 = username.matches("[\\u4e00-\\u9fa5]+");
System.out.println("flag1=" + flag1);
System.out.print("请输入邮箱:");
String email = input.next();
boolean flag2 = email.matches("\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+");
System.out.println("flag2=" + flag2);
}
}
5、测验1
定义一个工具类(RegexTool),工具类中有很多常用的正则方法,方法如下:
(1)、isChinese():判断一个字符串是否是中文,接收一个字符串类型参数,返回值类型为boolean
(2)、isEmail():判断一个字符串是否是邮箱,接收一个字符串类型参数,返回值类型为boolean
(3)、isPhone():判断一个字符串是否是手机号码,接收一个字符串类型参数,返回值类型为boolean
(4)、isAge():判断一个字符串是否是年龄(年龄只能为正整数),接收一个字符串类型参数,返回值类型为boolean
(5)、isIdCard():判断一个字符串是否是身份证,接收一个字符串类型参数,返回值类型为boolean
要求:方法全部为静态的。
/**
* Project Name:dt65_chapter16
* File Name:RegexTool.java
* Package Name:cn.java.utils
* Date:上午8:38:06
* Copyright (c) 2021, bluemobi All Rights Reserved.
*
*/
package cn.java.utils;
/**
* Description: <br/>
* Date: 上午8:38:06 <br/>
*
* @author LLL
* @version
* @see
*/
public class RegexTool {
/**
*
* Description: 判断一个字符串是否全部是中文<br/>
*
* @author LLL
* @param txt
* @return
*/
public static boolean isChinese(String txt) {// 静态方法
String regex = "[\\u4e00-\\u9fa5]+";
if (txt == null) {
System.err.println("亲,字符串不能够为null");
return false;
} // else {return txt.matches(regex);}
return txt.matches(regex);// 实例方法
}
/**
*
* Description: 判断给定的字符串是否是手机号<br/>
*
* @author LLL
* @param txt
* @return
*/
public static boolean isPhone(String txt) {
if (txt == null) {// 匹配使用matches方法,返回值类型为boolean
return false;
}
return txt.matches("[1][3578]\\d{9}");
}
public static void main(String[] args) {
}
}
Step1:util 放工具类
Step2:把代码粘贴过去,打入名字后alt+/快捷键调出(只有eclipse有代码就有!)
6、测验2
从键盘录入姓名(要求必须为中文)、邮箱、手机号、年龄、身份证号
要求:调用RegexTool类中的方法来校验输入的信息
二、切割
/**
* Project Name:dt65_chapter16
* File Name:Regex1.java
* Package Name:cn.java.demo
* Date:上午9:48:37
* Copyright (c) 2018, bluemobi All Rights Reserved.
*
*/
package cn.java.demo;
/**
* Description: <br/>
* Date: 上午9:48:37 <br/>
*
* @author LLL
* @version
* @see
*/
public class Regex1 {
public static void main(String[] args) {
/**
* 切割:所谓的切割是 将给定的字符串按照某种规则分割成多个子字符串
*/
String str1 = "张三,李四,王五,王二麻子"; //split(",")可以用,但统一加上\\
String[] strings = str1.split("\\,");
for (String temp : strings) {
System.out.println(temp);
}
String str2 = "张三.李四.王五.王二麻子"; //split(".")不行,因为.在正则里表示任意字符,已经被使用了
String[] strings = str1.split("\\.");
for (String temp : strings) {
System.out.println(temp);
}
String str3 = "张三 李四 王五 王二麻子 二狗子 赵六";
String[] strings = str1.split("\\ ");
for (String temp : strings) {
System.out.println(temp);
}
String str4 = "张三 李四 王五 王二麻子 二狗子 赵六";
String[] strings = str1.split("\\ +");
for (String temp : strings) {
System.out.println(temp);
}
String str5 = "张三-李四-王五-王二麻子";
String[] strings = str1.split("\\-");
for (String temp : strings) {
System.out.println(temp);
}
}
}
张三
李四
王五
王二麻子
三、替换
/**
* Project Name:dt65_chapter16
* File Name:Regex2.java
* Package Name:cn.java.demo
* Date:上午10:34:14
* Copyright (c) 2018, bluemobi All Rights Reserved.
*
*/
package cn.java.demo;
/**
* Description: 替换<br/>
* Date: 上午10:34:14 <br/>
*
* @author LLL
* @version
* @see
*/
public class Regex2 {
public static void main(String[] args) {
// 15999999999
/**
* 替换:所谓的替换是将给定字符串中满足正则要求的部分替换成指定的字符串。替换最终返回的结果类型为String
*/
String str1 = "仓桥家的东西不好吃,我们是绿茶店,我们的商品更好吃更优惠,联系电话:15912345678";// 仓桥家 绿茶
String str2 = str1.replaceAll("1[3578]\\d{9}", "15999999999");
System.out.println(str2);
}
}
叠词
/**
* Project Name:dt65_chapter16
* File Name:Regex3.java
* Package Name:cn.java.demo
* Date:上午11:02:29
* Copyright (c) 2018, bluemobi All Rights Reserved.
*
*/
package cn.java.demo;
/**
* Description: <br/>
* Date: 上午11:02:29 <br/>
*
* @author 丁鹏
* @version
* @see
*/
public class Regex3 {
public static void main(String[] args) {
/**
* 治结巴:"我..我....我..我....喜...喜...喜....欢...编...编.编.编....程"===>"我喜欢编程"<br>
* 叠词:aa、aa、ccc
*/
String str1 = "我..我....我..我....喜...喜...喜....欢...编...编.编.编....程";
// 1、第一次替换
String str2 = str1.replaceAll("\\.+", "");
System.out.println(str2);
// 2、第2次替换
/**
* 叠词的正则:(.)\\1+<br>
* 获取叠词中的一个字符:$1<br>
*/
String str3 = str2.replaceAll("(.)\\1+", "$1");
System.out.println("str3=" + str3);
}
}
我我我我喜喜喜欢编编编编程
str3=我喜欢编程