1、概念
就是由一些特定的字符组成,代表的是一个规则。
2、作用:
①用来校验数据格式是否合法
②在一段文本中查找满足要求的内容
3、概述、初体验
public class Test1 {
//目标:体验一下使用正则表达式来校验数据格式的合法性
//需求:校验qq的号码是否正确,要求全部是数字,不能以0开头,长度在(6,20)之间
public static void main(String[] args) {
System.out.println(checkqq(null));
System.out.println(checkqq("2341250234"));
System.out.println(checkqq("234gh8765"));
}
//正则表达式
public static boolean checkqq(String qq){
return qq!=null&&qq.matches("[1-9]\\d{5,19}");
}
public static boolean checkQQ( String qq){
//1、判断QQ号码是否为null
if (qq==null||qq.startsWith("0")||qq.length()<6&&qq.length()>20){
return false;
}
//2、判断qq号码中是否是数字
for (int i = 0; i < qq.length(); i++) {
//根据索引提取当前位置处的字符
char a=qq.charAt(i);
//判断a记住的字符,如果不是数字,qq不合法
if (a<'0'||a>'9'){
return false;
}
}
//说明qq号码是合法的
return true;
}
}
String提供了一个匹配正则表达式的方法
|-------------------------------------------------------------------------|
| public boolean matches (String regex)判断字符串是否匹配正则表达式,匹配返回true,不匹配返回false |
正则表达式的书写规则
1、子符类(只匹配单个字符)
|----------------------|------------------------|
| [abc] | 只能是a,b或c |
| [^abc] | 除了a,b,c之外的任何字符 |
| [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(等同于【ad-z】) |
| [a-z&&[^m-p]] | a到z,除了m到p(等同于【a-1q-z】) |
预定义字符(只匹配单个字符)
|-----|------------------|
| . | 任何字符 |
| \d | 一个数字:【0-9】 |
| \D | 非数字:【^0-9】 |
| \s | 一个空白字符 |
| \S | 非空白字符:【^\s】 |
| \w | [a-zA-Z_0-9] |
| \W | [^\w]一个非单词字符 |
数量词
?,*,+,{n}(数量词)
|--------|--------------|
| x? | x,一次或0次 |
| x* | x,零次或多次 |
| x+ | x,一次或多次 |
| x{n} | x,正好n次 |
| x{n,} | x,至少n次 |
| x{n,m} | x,至少n次但不超过m次 |
以上带【内容】只能匹配单个字符,预定义字符只能匹配单个字符
在Java中,\是有特殊用途的,例如特殊字符\t,代表缩进\n代表换在java中希望\就是\,则必须要转义。
其他几个常用的字符:(?i):忽略大小写,分组()
案例:
需求:校验用户输入的电话,邮箱,时间是否合法
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
checkphone();
}
public static void checkphone(){
while (true) {
System.out.println("请您输入手机号码");
Scanner sc=new Scanner(System.in);
String phone=sc.nextLine();
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 class Test3 {
//目标:正确使用正则表达式查找内容
public static void main(String[] args) {
method1();
}
//从以下内容中爬取出,手机,邮箱,座机,400电话等信息
public static void method1(){
String data="来黑马程序员学习Java,\n"+
"电话:1866668888,18699997777\n"+
"座机电话:01036517895,010-98951256\n"+
"邮箱:boniu@itcast.cn,\n"+
"邮箱:dlie0009@163.com,\n"+
"热线电话:400-619-9090,400-618-4000";
//1、定义爬取的规则
String regex="(1[3-9]\\d{9})|(0\\d[2-7]-?[1-9]\\d{4,19})";
//2、把正则表达式封装成一个Pattern对象
Pattern pattern=Pattern.compile(regex);
//3、通过Pattern对象去获取查找内容的匹配器对象
Matcher matcher=pattern.matcher(data);
//定义一个循环来爬取信息
while (matcher.find()){
String rs=matcher.group();
System.out.println(rs);
}
}
}
正则表达式用于搜索替换、分割内容,需要结合String提供的如下方法完成:
|------------------------------------------------------|-------------------------------|
| 方法名 | 说明 |
| public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
| public String [ ] split (String regex): | 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组 |
import java.util.Arrays;
public class Test4 {
public static void main(String[] args) {
//public String replaceAll(String regex,String newStr) 按照正则表达式匹配的内容进行替换
//需求1、请把 古力娜扎ai8888迪丽热巴999888as马儿扎哈fsfsedc卡尔炸吧,中间的非英文字符替换成"-"
String s1="古力娜扎ai8888迪丽热巴999888as马儿扎哈fsfsedc卡尔炸吧";
System.out.println(s1.replaceAll("\\w+", "-"));
//需求2、某语音系统收到一个口吃的人说的"我我我喜欢编编编程程!",需要优化成"我喜欢编程"
String s2="我我我喜欢编编编程程";
/*
(.)一组:匹配任意字符的
\\1:为这个组声明一个组号:1号
+;声明必须是重复的字
$1可以取到第一组代表的那个重复的字
*/
System.out.println(s2.replaceAll("(.)\\1+", "$1"));
// public String [ ] split (String regex): 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
//需求1:请把 古力娜扎ai8888迪丽热巴999888as马儿扎哈fsfsedc卡尔炸吧,中间的人名获取出来
String[]names= s1.split("\\w+");
System.out.println(names);
System.out.println(Arrays.toString(names));
}
}