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

java正则化表达式速通

  • 快速入门
    • 为什么要学
    • 基本介绍
    • 底层实现(重要)
      • matcher.find()
      • matcher.group
        • group(0)
      • 小结
  • 正则表达式基本语法
    • 基本介绍
    • 转义符
    • 字符匹配符
      • **[ ] 和 (?i)右不区分大小写**
      • [ ^]
      • 用法案例 : . , \\\S , \\\ \\\D \\\d ^ [ ]
    • 选择匹配符 (相当于或)
    • 限定符 (限定出现次数)
    • 定位符 (规定出现在开始结束)
    • 注意细节
  • 三个常用类
    • Pattern ——> Matcher——> PatternSyntaxException
    • Pattern整体匹配
  • 捕获分组
  • 非捕获分组
  • 反向引用
    • 分组-> 捕获-> 引出反向引用
  • 应用
    • 常规使用
    • String.API 替换 匹配 分隔
    • 匹配邮箱
    • 验证整数或小数
    • 验证整数或小数

快速入门

为什么要学

java正则表达式(一篇速通)_第1张图片

java正则表达式(一篇速通)_第2张图片

java正则表达式(一篇速通)_第3张图片
java正则表达式(一篇速通)_第4张图片

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

基本介绍

java正则表达式(一篇速通)_第5张图片

底层实现(重要)

java正则表达式(一篇速通)_第6张图片

案例:
java正则表达式(一篇速通)_第7张图片

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

matcher.find()

java正则表达式(一篇速通)_第8张图片

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

matcher.group

java正则表达式(一篇速通)_第9张图片

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) 
//带小括号的说明进行了分组 
//第一个小括号 第一组  
//第二个小括号 第二组

java正则表达式(一篇速通)_第10张图片

小结

java正则表达式(一篇速通)_第11张图片


正则表达式基本语法

基本介绍

java正则表达式(一篇速通)_第12张图片

转义符

java正则表达式(一篇速通)_第13张图片

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

字符匹配符

java正则表达式(一篇速通)_第14张图片

java正则表达式(一篇速通)_第15张图片

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

java正则表达式(一篇速通)_第16张图片

写法案例:

java正则表达式(一篇速通)_第17张图片

[ ^]

java正则表达式(一篇速通)_第18张图片

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

java正则表达式(一篇速通)_第19张图片


选择匹配符 (相当于或)

java正则表达式(一篇速通)_第20张图片

案例

java正则表达式(一篇速通)_第21张图片


限定符 (限定出现次数)

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

java正则表达式(一篇速通)_第22张图片

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

java正则表达式(一篇速通)_第23张图片

: + ——1次~n次

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

java正则表达式(一篇速通)_第24张图片

案例:

java正则表达式(一篇速通)_第25张图片

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

java正则表达式(一篇速通)_第26张图片

注意细节

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

三个常用类

Pattern ——> Matcher——> PatternSyntaxException

java正则表达式(一篇速通)_第27张图片

此处方法需要的时候再查
java正则表达式(一篇速通)_第28张图片
此处方法比较常用,需要熟悉

java正则表达式(一篇速通)_第29张图片

部分常用方法演示:

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

java正则表达式(一篇速通)_第30张图片

​ replaceAll()

java正则表达式(一篇速通)_第31张图片


Pattern整体匹配

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

捕获分组

什么是捕获分组

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

java正则表达式(一篇速通)_第32张图片

  • 即记录整个大字符串的开始索引和结束索引 ,也记录分组的小段开始和结束索引
    java正则表达式(一篇速通)_第33张图片

  • 以上为第一种分组方式

两种分组方式:

java正则表达式(一篇速通)_第34张图片

方式二命名分组:

可以给组取名 举例

java正则表达式(一篇速通)_第35张图片

非捕获分组

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

java正则表达式(一篇速通)_第36张图片

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

反向引用

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

java正则表达式(一篇速通)_第37张图片

反向引用案例

在这里插入图片描述

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

java正则表达式(一篇速通)_第38张图片

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

java正则表达式(一篇速通)_第39张图片

练习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");

应用

常规使用

java正则表达式(一篇速通)_第40张图片

//汉字
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 = "[email protected]";
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 = "[email protected]";
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求生,java,正则表达式,开发语言)