java正则表达式(一篇速通)

快速入门

为什么要学

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以快速查找文本中的信息

基本介绍

在这里插入图片描述

底层实现(重要)

在这里插入图片描述

案例:
在这里插入图片描述

  • find 和 group 究竟做了什么 (往下看)

matcher.find()

在这里插入图片描述

  • 根据规则定位字符串(如1998)
  • 找到后, 将字符串开始的索引记录到matcher对象的属性 int[ ] group;
  • 例如 “1998”, group[0]=0; 把该子字符串的结束的索引+1的值记录到 group[1] = 4
  • 同时记录oldLast的值为子字符串结束的 索引+1的值即为4 ,下次find时从4开始

matcher.group

在这里插入图片描述

group(0)
  • 根据 group[0] = 0 和 group[1] = 4的记录位置,从content 截取字符串返回 —— > [0,4)
  • matcher.group(0) ——> 对group[0] 和group[1] 不断更新
  • matcher.group(0) 相当于取 符号要求的整个长字符串
  • 以下为分组后的情况 group(0)依旧是整个长字符串 其他的取第几组填 group(第几)就可以
//比如正则表达式 \d\d\d\d 和 (\d\d)(\d\d) 
//带小括号的说明进行了分组 
//第一个小括号 第一组  
//第二个小括号 第二组

在这里插入图片描述

小结

在这里插入图片描述


正则表达式基本语法

基本介绍

在这里插入图片描述

转义符

在这里插入图片描述

//  两条\\表示转义 \\(  表示( 

字符匹配符

在这里插入图片描述

在这里插入图片描述

[ ] 和 (?i)右不区分大小写

在这里插入图片描述

写法案例:

在这里插入图片描述

[ ^]

在这里插入图片描述

用法案例 : . , \\S , \\ \\D \\d ^ [ ]

在这里插入图片描述


选择匹配符 (相当于或)

在这里插入图片描述

案例

在这里插入图片描述


限定符 (限定出现次数)

一般需要用括号()确定范围

在这里插入图片描述

​ 默认贪婪匹配 ,一次性匹配最多

在这里插入图片描述

: + ——1次~n次

: * —— 0次~n次
? —— 0次或1次

在这里插入图片描述

案例:

在这里插入图片描述

定位符 (规定出现在开始结束)

在这里插入图片描述

注意细节

  • 贪婪匹配 ,默认匹配多的 —— 如 a{3,4} 匹配 aaaa 而不是aaa
  • ^ 在[ ] 内为相当于非 ,^在开头为指定起始字符
  • \\b可能接的是空格,可能接的是结尾 \\B与\\b表示相反
  • ? 紧随在任何匹配符后时,匹配模式是非贪心的
  • ^和 指定开头和结尾是指整个文段的开头和结尾例如 ( ′ ′ 你 a 我 a 他 ′ ′ 用 限 定开头是中文只能查 到 ′ 你 ′ 用 指定开头和结尾是指整个文段的开头和结尾 例如( ''你a我a他'' 用^限定开头是中文只能查到'你' 用 指定开头和结尾是指整个文段的开头和结尾例如(′′aa′′定开头是中文只能查限定结尾是中文只能查到’他’ )
  • [ ]之内的符号就是符号本身 需要\\转义才能表示特殊匹配符( 如[ \\w w])

三个常用类

Pattern ——> Matcher——> PatternSyntaxException

在这里插入图片描述

此处方法需要的时候再查
在这里插入图片描述
此处方法比较常用,需要熟悉

在这里插入图片描述

部分常用方法演示:

​ start() end() 整体matcher()

在这里插入图片描述

​ replaceAll()

在这里插入图片描述


Pattern整体匹配

Pattern.matcher(regStr,content)  返回boolean
// 用于验证整体字符串是否满足某个条件  返回真假

捕获分组

什么是捕获分组

//比如正则表达式 \d\d\d\d 和 (\d\d)(\d\d) 
//带小括号的说明进行了分组  并且有编号1234..... 能够进行用括号分隔 是不是长得像用括号框住 称捕获 
//第一个小括号 第一组  
//第二个小括号 第二组

在这里插入图片描述

  • 即记录整个大字符串的开始索引和结束索引 ,也记录分组的小段开始和结束索引
    在这里插入图片描述

  • 以上为第一种分组方式

两种分组方式:

在这里插入图片描述

方式二命名分组:

可以给组取名 举例

在这里插入图片描述

非捕获分组

  • 不能用括号框住 ,称非捕获
  • 不能用group(1) ,只能用 group(0) (参考上方group解释)

在这里插入图片描述

  • (? : pattern)——> 在这里插入图片描述
    相当于或
  • (?= pattern)——>在这里插入图片描述
    相当于限定能后接的结尾
  • (?! pattern)——>在这里插入图片描述
    相当于限定不能后接的结尾

反向引用

分组-> 捕获-> 引出反向引用

在这里插入图片描述

反向引用案例

在这里插入图片描述

练习1: 内部反向匹配 \\1 在查找过程中进行引用

在这里插入图片描述

练习2:内部反向匹配 \\1

在这里插入图片描述

练习3: 外部反向匹配 $1 在查找结束后进行引用(重要理解!!!!)

//将 我...我我...要要要..学学学学java  ——> 我要学java
String content = "我...我我...要要要..学学学学java";
//1.去掉所有.
Pattern pattern = Pattern.compile("\\.");
Matcher matcher = pattern.matcher(content);
content = matcher.replaceAll("");
System.out.println(content);//我我我要要要学学学学java
//2.去掉重复的子
// 1.查出重复的 (.)\\1+
Matcher matcher1 = Pattern.compile("(.)\\1+").matcher(content);
while(matcher1.find()){
    System.out.println("找到: " + matcher1.group(0));
}
// 2.反向引用$1 来替换匹配到的内容
content = matcher1.replaceAll("$1");//--------------------相当于用$1指定的字符替换整个字符
System.out.println(content);   //我要学java

 //3.一条语句完成去掉.之后的操作
Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");

应用

常规使用

在这里插入图片描述

//汉字
String regstr = "[\u0391-\uffe5]+$";
//1-9开头 (5位-10位)
String regstr = "^[1-9]\\d{4,9}$"
//手机号要求
String regstr = "^1[3|4|5|8]\\d{9}$"
//验证URL
String regstr = "^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.]*)?$"; 

String.API 替换 匹配 分隔

//使用正则表达式进行替换
//Str.replaceAll()
String content = "JDK1.4 JDK1.5"
content = content.replaceAll("JKD1\\.4|JDK1\\.5" , "JDK");

 //Str.matcher(regex)的使用
content = "13888889999";
System.out.println(content.matches("1(38|39)\\d{8}"));

//Str.split() 使用
 System.out.println("===================");
content ="hellow#abc-jack~背景";
String[] split = content.split("#|-|~");
for (String s : split) {
   System.out.println(s);
}

匹配邮箱

 //验证邮箱
String cont = "sdasd@ss.com";
String regStr ="^[\\w-]+@[a-zA-Z]+\\.+[a-zA-Z]+$";
System.out.println(cont.matches(regStr));

验证整数或小数

//验证是整数或小数
System.out.println("要么是整数 要么是小数================");
regStr ="^\\-?([1-9]\\d*|0)(\\.\\d+)?$";
cont ="1222";
System.out.println(cont.matches(regStr));
``java
 //验证邮箱
String cont = "sdasd@ss.com";
String regStr ="^[\\w-]+@[a-zA-Z]+\\.+[a-zA-Z]+$";
System.out.println(cont.matches(regStr));

验证整数或小数

//验证是整数或小数
System.out.println("要么是整数 要么是小数================");
regStr ="^\\-?([1-9]\\d*|0)(\\.\\d+)?$";
cont ="1222";
System.out.println(cont.matches(regStr));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值