在Java中,正则表达式是一种强大的工具,用来校验和处理字符串数据。这篇文章将从入门到实战的角度,介绍Java正则表达式的基础知识和实用技巧。
一、正则表达式基础
正则表达式是一个由字符和操作符组成的模式,用来描述文本中的字串筛选规则。在Java中,可以使用java.util.regex包中的类来处理正则表达式。
1.字符匹配
String pattern = "abc";//匹配abc字符串 String str = "abc";//要匹配的字符串 System.out.println(str.matches(pattern));//true
2.字符集合
String pattern = "[abc]";//匹配a、b或c单个字符 String str = "a";//要匹配的字符串 System.out.println(str.matches(pattern));//true
3.字符数量
String pattern = "a{3}";//匹配3个a字符 String str = "aaa";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "a{2,}";//匹配2个或以上a字符 str = "aaa";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "a{2,4}";//匹配2个到4个a字符 str = "aaa";//要匹配的字符串 System.out.println(str.matches(pattern));//true
4.特殊字符
String pattern = "\\d";//匹配数字字符 String str = "1";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "\\D";//匹配非数字字符 str = "a";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "\\s";//匹配空白字符 str = " ";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "\\S";//匹配非空白字符 str = "a";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "\\w";//匹配字母数字字符 str = "a";//要匹配的字符串 System.out.println(str.matches(pattern));//true pattern = "\\W";//匹配非字母数字字符 str = "!";//要匹配的字符串 System.out.println(str.matches(pattern));//true
二、实际应用场景
在Java开发中,正则表达式可以用于以下实际应用场景:
1.校验用户输入
//检查邮箱格式 String pattern = "[a-zA-Z0-9_-]+@[a-zA-Z0-9]+\\.[a-zA-Z]+"; String email = "abc@test.com"; System.out.println(email.matches(pattern));//true //检查手机号格式 pattern = "1[3456789]\\d{9}"; String phone = "13712345678"; System.out.println(phone.matches(pattern));//true //检查身份证号格式 pattern = "[1-9]\\d{5}(18|19|20)\\d{2}(0\\d|1[012])(0\\d|[12]\\d|3[01])\\d{3}[Xx\\d]"; String idCard = "310101199001010101"; System.out.println(idCard.matches(pattern));//true
2.替换特定字符
String pattern = "<.*?>";//剔除HTML标签 String html = "这是一段测试文本
"; System.out.println(html.replaceAll(pattern, ""));//这是一段测试文本 pattern = "(\\d{4})-(\\d{2})-(\\d{2})";//格式化日期字符串 String date = "20210101"; String result = date.replaceAll(pattern, "$1年$2月$3日"); System.out.println(result);//2021年01月01日
3.提取关键信息
String pattern = "(?<=\\()[^)\\s]+(?=\\))";//提取括号内的内容 String str = "这是一段(括号内的)测试文本"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(str); if (m.find()) { System.out.println(m.group(0));//括号内的 } pattern = "(?=.*[a-zA-Z])(?=.*\\d)[^\\s]{8,16}";//匹配至少8个字符,并包含至少一个字母和一个数字 String password = "password1"; System.out.println(password.matches(pattern));//true
三、实战练习
接下来,带大家完成一个实际练习,校验手机号码归属地。
1.获取手机号码前7位
String phone = "13712345678"; String areaCode = phone.substring(0, 7); System.out.println(areaCode);//1371234
2.请求接口
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel="; String response = HttpUtil.get(url + areaCode); System.out.println(response);//{"mts":"1370000-1399999","province":"广东","catName":"中国移动","telString":"1371234"}
3.使用正则表达式提取信息
String pattern = "(?<=province\":\")[^\"]+(?=\")";//提取省份信息 Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(response); if (m.find()) { System.out.println("所在省份:" + m.group(0));//所在省份:广东 } pattern = "(?<=catName\":\")[^\"]+(?=\")";//提取运营商信息 r = Pattern.compile(pattern); m = r.matcher(response); if (m.find()) { System.out.println("运营商:" + m.group(0));//运营商:中国移动 }
通过手机号码前7位,使用正则表达式校验手机号码归属地,并获取相关信息。