正则表达式可以用一些规定的字符来指定规则,并用来校验数据格式的合法性。
比如:规定用户名只能用英文名,密码规定只能6位,手机号是否合法,就需要用正则表达式来校验。
需求:假如现在要求校验一个QQ号是否正确,6位及10位内,必须全部是数字。
public static void main(String[] args) {
// 模拟用户输入QQ号
String input01 = "952396051";
System.out.println(checkQQ(input01));
System.out.println(regexCheckQQ(input01));
String input02 = "12345678901";
System.out.println(checkQQ(input02));
System.out.println(regexCheckQQ(input02));
String input03 = "123qq321";
System.out.println(checkQQ(input03));
System.out.println(regexCheckQQ(input03));
String input04 = null;
System.out.println(checkQQ(input04));
System.out.println(regexCheckQQ(input04));
}
/*
用正则表达式校验qq是否合法的方法
return qq号合法返回true,否则返回false
*/
public static boolean regexCheckQQ(String qq){
// “\\d”:第一个“\”是转义的意思,相当于是告诉第二个"\"你就是一个杠
// "\d":代表全数字:0-9
// {6,10}:代表是6—10位之间
// 输入的qq号不能为null且全部是0-9之间的数字,6-10之间时,返回true,否之返回false
return qq!=null&&qq.matches("\\d{6,10}");
}
/*
检验qq是否合法的普通方法
return QQ号合法返回true,否之返回false
*/
public static boolean checkQQ(String qq){
// 当用户输入的qq为null或长度小于6或长度大于10时说明符合条件,返回false
if (qq==null || qq.length()<6 || qq.length()>10){
return false;
}
// 遍历qq号,得到每位字符
for (int i = 0; i < qq.length(); i++) {
char ch = qq.charAt(i);
// 当得到的字符不是数字说明超出0-9的范围,返回false
if (ch<'0'||ch>'9'){
return false;
}
}
// 遍历结束,说明全部是数字,返回true
return true;
}
规则 说明
[abc] 只能是a, b, 或c
[^abc] 除了a, b, c之外的任何字符
[a-zA-Z] a到z A到Z,包括(范围)——>大小写英文字母
[a-d[m-p]] a到d,或m通过p:([a-dm-p]联合)
[a-z&&[def]] d, e, 或f(交集)
[a-z&&[^bc]] a到z,除了b和c:([ad-z]减法)
[a-z&&[^m-p]] a到z,除了m到p:([a-lq-z]减法)
规则 说明
. 任何字符
\d 一个数字:[0-9]
\D 非数字:[^0-9]
\s 一个空白字符:[\t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w [a-zA-Z_0-9]英文、数字、下划线
\W [^\w]一个非单词字符
规则 说明
X? X,一次或根本不
X* X,零次或多次
X+ X,一次或多次
X{n} X,正好n次
X{n,} X,至少n次
X{n,m} X,至少n次但不超过m次
方法 | 说明 |
public boolean matches(String regex) | 判断是否匹配正则表达式,匹配返回true,不匹配返回false |
String类的matches()方法:判断是否与正则表达式匹配,是则返回true,否之返回false。
public static void main(String[] args) {
// 以下都是默认匹配一个字符
// 只能是abc
System.out.println("a".matches("[abc]"));
System.out.println("d".matches("[abc]"));
// 不能出现abc
System.out.println("a".matches("[^abc]"));
System.out.println("d".matches("[^abc]"));
// 只能说一个数字
System.out.println("a".matches("\\d"));
System.out.println("10".matches("\\d"));
System.out.println("1".matches("\\d"));
// 只能是一个大小写英文字母、数字、下划线
System.out.println("a".matches("\\w"));
System.out.println("A".matches("\\w"));
System.out.println("_".matches("\\w"));
System.out.println("3".matches("\\w"));
System.out.println("abc".matches("\\w"));
System.out.println("ABC".matches("\\w"));
System.out.println("32".matches("\\w"));
System.out.println("你".matches("\\w"));
System.out.println("你好".matches("\\w"));
// 校验密码
// 必须是数字、字母、下划线至少8位
String regex1 = "\\w{8,}";
System.out.println("123Abc_kk".matches(regex1));
System.out.println("123456".matches(regex1));
System.out.println("你好世界12345".matches(regex1));
// 验证码:必须是数字、字符、必须是4位
String regex2 = "[a-zA-Z0-9]{4}";
System.out.println("ikun".matches(regex2));
System.out.println("_heizi".matches(regex2));
}
控制台输出结果:
案例一
请使用正则表达式完成如下需求:
请编写程序模拟用户输入手机号码、邮箱号码、验证码、是否正确,并给出提示,直到格式输入正确为止。
分析实现:
public static void main(String[] args) {
// 键盘录入
Scanner sc = new Scanner(System.in);
// 调用校验手机号码的方法
checkPhone(sc);
// 调用校验邮箱号码的方法
checkEmail(sc);
}
/*
定义一个校验手机号的方法
*/
public static void checkPhone(Scanner sc){
// 定义循环:电话格式有误时重新输入,直到格式输入正确为止
while (true){
// 提示输入
System.out.println("请输入您的电话号码:");
String phone = sc.next();
/* 定义一个校验手机号的正则表达式:
* 1[3-9]代表前一位是1,后一位号码为3-9,
* [0-9]{9}代表后面9位数字可都为0-9,加上前两位一共11位。
* */
String regex = "1[3-9][0-9]{9}";
// 校验手机号码if判断,正确结束循环,错误继续循环
if (phone.matches(regex)){
System.out.println("格式正确");
break;
}else {
System.out.println("格式不对哦");
}
}
}
/*
定义校验邮箱的正则表达式
*/
public static void checkEmail(Scanner sc){
// 定义循环:邮箱格式有误时重新输入,直到格式输入正确为止
while (true){
// 提示输入
System.out.println("请输入你的邮箱:");
String email = sc.next();
/*
\\w:字符有一个或者多个构成(包括大小写数字下划线);
@:符号直接表示;
\\w{2,5}:表示这是一个2-5的字符串比如qq,163
\\:表示一个转义的符号,单个.表示任意字符
com:表示后缀
*/
String regex = "\\w+@\\w{2,5}\\.com";
if(email.matches(regex)){
System.out.println("您输入的邮箱格式正确");
break;
}else {
System.out.println("邮箱格式有误!");
}
}
}
控制台输出结果:
案例二
需求:校验金额是否合法:
小数点后大于两位即为不合法,小数点后还有小数点也为不合法;
public static void main(String[] args) {
// 调用校验金额方法
checkMoney();
}
/*
定义一个校验金额的方法
*/
public static void checkMoney(){
// 创建键盘录入对象,用于输入数据
Scanner sc = new Scanner(System.in);
// 定义循环,如果输入为非法金额继续循环
while (true){
System.out.println("请输入您需要校验的金额");
String money = sc.next();
// 排除了非数字,中英文,空格,非正常数字(例如001),小数点大于2位
String regex = "(^[1-9](\\d+)?(\\.\\d{1,2})?$)|(^0$)|(^\\d\\.\\d{1,2}$)";
if (money.matches(regex)){
System.out.println("此为合法金额...");
// break; //输入合法金额后结束循环
}else {
System.out.println("此为非法金额....");
}
}
}
控制台输出结果:
方法 | 说明 |
public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[] split(String regex) | 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组。 |
例子: 使用正则表达式匹配的内容进行分割字符串,返回一个字符串数组
public static void main(String[] args) {
// 模拟得到一串混乱的数据,但是你想拿出这串数据里面的文字
String name = "bxiauhkldsa集结ldjskadksl立刻ljk;132314|[.出发";
/*
\\w:代表数字、单词字符、下划线
\\p{Punct}:代表标点符号:其中之一!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+:代表出现1次或多次
*/
String[]strArrays = name.split("[\\w\\p{Punct}]+");
// 遍历分割后得到的文字
for (int i = 0; i < strArrays.length; i++) {
System.out.println(strArrays[i]);
}
// 按照正则表达式匹配的内容进行替换,返回一个字符串结果
String name2 = name.replaceAll("[\\w\\p{Punct}]+"," ");
System.out.println(name2);
}
控制台输出结果:
例子:
模拟网上爬到的一段数据,从数据中爬取出电话,邮箱
public static void main(String[] args) {
// 模拟从网上爬到一段信息数据
String data = "我是胡图图我住在翻斗花园我电话是17777207426,找不到我可以联系我邮箱[email protected]"+
"我是健康哥哥我现在在教小豆班我的电话是13709872663,可以直接联系我的邮箱[email protected]";
/* 定义一个爬取邮箱,电话的正则表达式:
邮箱规则:
\\w+:代表数字、单词字符出现一次或者多次
@:代表一个@
\\.\\:代表.后的数字,单词字符出现一次或多次
{2,3}:可以出现com|cn
手机号规则
第一位是1
第二位为3-9
\\d:9位数字
*/
String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}|"+"(1[3-9]\\d{9})";
// 爬取规则编译成匹配对象
Pattern pattern =Pattern.compile(regex);
// 得到一个信息匹配器对象
Matcher matcher = pattern.matcher(data);
// 定义一个死循环,根据信息匹配器去爬取规则指定信息
while (matcher.find()){
// 爬到一个指定信息就分成一组
String result = matcher.group();
// 输出结果
System.out.println(result);
}
}
控制台输出结果: