关于正则表达式的了解学习,以及用于校验格式,信息查找和替换分割内容。
目录
1.概述
2.书写规则
3.应用案例
4.用于信息查找
5.用于搜索替换,分割内容
1.概述
由一些特定的字符组成,代表一个规则
作用:
1.校验数据是否合法
2.在一段文本中查找满足要求的内容
package regax;
public class Text1 {
public static void main(String[] args) {
//目标:体验使用正则表达式
//需求:校验QQ号码是否正确,要求全是数字,长度在(6-20)之间,不能以0开头
System.out.println(checkQQ(null));
System.out.println(checkQQ("1234655"));
System.out.println(checkQQ("4654a65"));
System.out.println("___________________________________");
System.out.println(checkQQ1(null));
System.out.println(checkQQ1("1234655"));
System.out.println(checkQQ1("4654a65"));
System.out.println("___________________________________");
}
public static boolean checkQQ1(String qq){
return qq != null && qq.matches("[1-9]\\d{5,19}");
}
public static boolean checkQQ(String qq){
//判断是否为null
if(qq == null || qq.startsWith("0")||qq.length()<6||qq.length()>20){return false;}
//判断是否都是数字
for (int i = 0; i < qq.length(); i++) {
//根据索引获取对应数据
char ch = qq.charAt(i);
//判断ch的字符
if(ch<'0'||ch>'9'){return false;}
}
return true;
}
}
相比常规的方法,正则表达式更加简洁方便
2.书写规则
String提供的匹配正则表达式的方法
public boolean matches(String regex) 判断字符串是否匹配,匹配返回true,反之返回false
字符类
[abc] 只能是abc
[^abc] 除了zbc外的字符
[a-zA-Z] a到z A到Z (包括的范围)
[a-d[m-p]] a到d或者m-p
[a-z&&[def]] d,e,f(交集)
[a-z&&[^bc]] a到z,除了b和c
[a-z&&[^m-p]] a到z,除了m到p
“匹配内容 (匹配内容)”
预定义字符集
. 匹配任意字符
\d 匹配数字,等价于 [0-9]。
\D 匹配非数字,等价于 [^0-9]。
\w 匹配单词字符,包括字母、数字和下划线,等价于 [a-zA-Z0-9_]。
\W 匹配非单词字符,等价于 [^a-zA-Z0-9_]。
\s 匹配空白字符,包括空格、制表符和换行符等,等价于 [ \f\r\n\t\v]。
\S 匹配非空白字符,等价于 [^ \f\r\n\t\v]。
数量词
(判断出现次数)
X ? 表示 0 或 1 次匹配。
X * 表示 0 或多次匹配。
X+ 表示 1 或多次匹配。
X{n} 表示精确匹配 n 次。
X{n,} 表示至少匹配 n 次。
X {n,m} 表示至少匹配 n 次,最多匹配 m 次。
元字符:
^ 匹配输入字行首。
$ 匹配输入行尾。
\ 将下一个字符标记为特殊字符或转义字符。
模式修正符
i 表示忽略大小写。
m 表示多行匹配。
s 表示单行匹配
3.应用案例
需求:校验用户输入的电话,邮箱,时间是否合法
package regax;
import java.util.Scanner;
public class Text2 {
public static void main(String[] args) {
//checkTel();
checkTime();
}
public static void checkTel(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入电话号码|座机");
String phone = sc.next();
if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?)[1-9]\\d{4,19}")){
System.out.println("您输入的格式正确");
break;
}
else{
System.out.println("您输入的号码格式不正确");
}
}
}
public static void checkEmail(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入邮箱");
String email = sc.next();
if(email.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
System.out.println("您输入的格式正确");
break;
}
else{
System.out.println("您输入的邮箱格式不正确");
}
}
}
public static void checkTime(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入时间");
String time = sc.next();
if(time.matches("1?[0-9]:[0-6][0-9]|2?[0-4]:[0-6][0-9]|[0-9]:[0-6][0-9]")){
System.out.println("您输入的格式正确");
break;
}
else{
System.out.println("您输入的时间格式不正确");
}
}
}
}
4.用于信息查找
需求:把文本中的电话,邮箱,座机号码,热线都爬取出来
package regax;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Text3 {
public static void main(String[] args) {
String data = "java学习\n"+"电话:18703442157\n"+"邮箱:2293581974@qq.com\n";
//定义爬取规则(正则表达式)
String regex = "(1[3-9]\\d{9})|(\\w{1,}@\\w{2,10})(\\.\\w{2,10}){1,2}|(0\\d{2,5}-?\\d{5,15})";
//2.把 爬取规则封装成一个pattern对象
Pattern pattern = Pattern.compile(regex);
//3.通过pattern对象得到查找内容的匹配器
Matcher matcher = pattern.matcher(data);
//4.通过匹配器开始去内容中查找信息
while(matcher.find()){
System.out.println(matcher.group());
}
}
}
5.用于搜索替换,分割内容
实现功能需要结合以下的方法
方法名 | 说明 |
public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[ ] split (String regex) | 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组 |
package regax;
import java.util.Arrays;
public class Text4 {
public static void main(String[] args) {
//1.内容替换
//需求 将非中文字符成-
String s1 = "陈平安hsgjel宁姚gjoass阮秀lfh";
System.out.println(s1.replaceAll("\\w+", "-"));
//需求 删除重复字符
String s2 = "我我我喜欢编编编编编编编编编编编编程";
/*
* (.) 一组,匹配任意字符
* \\1 为这个组声明一个组好 1号
* + 声明必须是重复字
* $1 去访问到第一组代表的那个重复的字
* */
System.out.println(s2.replaceAll("(.)\\1+", "$1"));
//需求 获取人名
String s3 = s1;
String[] name = s3.split("\\w+");
System.out.println(Arrays.toString(name));
}
}