Java 正则表达式 基本知识点汇总

正则表达式

快速入门

有下面一段文字怎么找出其中所有的英文字母?

由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区别。
//通过字母ASCll码的范围判断是否为字母 太繁琐及复杂 
char a = 'a';
int aint = (int)a;
//使用正则表达式
public static void main(String[] args) {
        String content  = "由于在开发Oak语言时,尚且不存在运行字节码的硬件平台," +
                "所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和" +
                "软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台," +
                "整个系统除了比C++更加简单之外,没有什么大的区别。";

        Pattern pattern = Pattern.compile("[a-zA-Z]+");//模式对象 正则表达式对象 匹配字母
    	//Pattern pattern = Pattern.compile("[0-9]+"); //匹配数字
    	//Pattern pattern = Pattern.compile("([a-zA-Z]+)|([0-9]+)");//数字和字母
        Matcher matcher = pattern.matcher(content);//匹配器
        while(matcher.find()){
            System.out.println("找到:"+matcher.group(0));
        }
    }

找到:Oak
找到:C

如果要查找百度热搜呢?

 <a target="_blank" title="甘肃越野赛事故成立联合调查组" href="/s?rsv_idx
  Pattern pattern = Pattern.compile("<a target=\"_blank\" title=\"(\\S*)\"");
  Matcher matcher = pattern.matcher(content);
  while(matcher.find()){
            System.out.println("找到:"+matcher.group(1));
  }

ip地址呢?

A类 10.0.0.0--10.255.255.255
B类 172.16.0.0--172.31.255.255
C类 192.168.0.0--192.168.255.255
Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");//ip地址
Matcher matcher = pattern.matcher(content);//匹配器
while(matcher.find()){
    System.out.println("找到:"+matcher.group(0));
}

找到:10.0.0.0
找到:10.255.255.255
找到:172.16.0.0
找到:172.31.255.255
找到:192.168.0.0
找到:192.168.255.255

分析下matcher.find()和matcher.group(0)的底层逻辑

在这里插入图片描述

 //根据指定规则,定位满足规则的子字符串,将满足条件的子字符串的开始索引位置和结束索引位置+1记录到int[] groups;属性中,
 // groups[0]=xxx,groups[1]=xxx,同时记录oldLast为结束索引位置+1,代表下次执行匹配时从什么时候开始
//matcher.group(0) 方法源码 会根据groups数组的值来截取相应字符串
public String group(int group) {
    if (first < 0)
        throw new IllegalStateException("No match found");
    if (group < 0 || group > groupCount())
        throw new IndexOutOfBoundsException("No group " + group);
    if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
        return null;
    return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
}

我们看下group(0) group(1) group(2)区别

应用于() 分组中,一个()代表一组

 String contents = "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本";
        Pattern pattern = Pattern.compile("(\\d\\d)(\\d\\d)");
        Matcher matcher = pattern.matcher(contents);//匹配器
        while(matcher.find()){
            System.out.println("找到:"+matcher.group(0));//整体的字符串索引位置存放在groups数组中0 和 1 下标中 ,注意1位置的字符串结束索引位置+1
            System.out.println("找到第一组():"+matcher.group(1));//第一组 放在groups数组中2 和 3 下标中
            System.out.println("找到第二组():"+matcher.group(2));//第二组 放在groups数组中4 和 5 下标中
            //如果没有第三组但是取第三组的话,会报错,因为截取的是 [-1,-1)的范围
        }

找到:1998
找到第一组()19
找到第二组()98
找到:1999
找到第一组()19
找到第二组()99

在这里插入图片描述

基本语法

三个常用类

在这里插入图片描述

全额匹配 Pattern.matches

boolean matches = Pattern.matches(regstr, content);//全额匹配
System.out.println(matches);

//底层源码
public static boolean matches(String regex, CharSequence input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    return m.matches();
}

Matcher类基本方法

在这里插入图片描述

在这里插入图片描述

分组、捕获、反向引用

在这里插入图片描述

分组

在这里插入图片描述

在这里插入图片描述

//这两个是等价的,第二个比较简写和经济,注意第二个和捕获分组匹配没有关系了,不能通过group(1)取值
regstr = "abc1|abc2|abc3";
regstr = "abc(?:1|2|3)";

捕获

反向引用

regstr = "(\\d)\\1";//两个连续数字
regstr = "(\\d)(\\d)\\2\\1";//1221 2112

元字符

某些字符需要转义 . * + ( ) $ / \ ? [ ] ^ { } 这些需要加上\\转移 才能匹配到

限定符

用于指定其前面的字符和组合项连续出现多少次

在这里插入图片描述

在这里插入图片描述

选择匹配符

在匹配某个字符串的时候是有选择性的,既可以匹配这个 又可以匹配那个,就要用到选择匹配符| 比如“ab|cd” 匹配ab或cd

在这里插入图片描述

String regstr = "a{3,4}";//可以aaa aaaa 但是java是贪婪匹配,默认匹配多aaaa的
regstr = "1+";//匹配一个1或者多个1 也是贪婪匹配 结果 11111
regstr = "a1?";//匹配a1 a,默认贪婪a1

在这里插入图片描述

分组组合和反向引用符

特殊字符

在这里插入图片描述

字符匹配符

在这里插入图片描述

在这里插入图片描述

\\w 匹配单个数字 字母 下划线;上图有误差
\\s 匹配空格 制表符
\\S 匹配任何非空白字符
. 匹配除\n以外所有字符,若要匹配.字符 需要\\. 转义
String contents = "fsldfjsld09sdfABC";
String regstr1 = "[a-z]";//a-z 之间任意一个字符
String regstr2 = "[A-Z]";//A-Z 之间任意一个字符
String regstr3 = "abc";//匹配abc  默认区分大小写
String regstr4 = "(?i)abc";//匹配abc  不区分大小写
String regstr5 = "[0-9]";//0-9 之间任意一个字符
Pattern pattern = Pattern.compile(regstr3,Pattern.CASE_INSENSITIVE);//不区分大小写
Matcher matcher = pattern.matcher(contents);//匹配器

定位符

规定要匹配的字符串出现的位置,比如在字符串的开始还是结束的位置

在这里插入图片描述

 content = "1a11111aaaa";
 regstr = "^[0-9]+[a-z]+$";//以至少一个数字开头,必须至少一个小写字母结束. 这个匹配上面content匹配不到,应该是
        //数字后紧接小写字母结束吧
regstr = "^[0-9]+\\-[a-z]+$";//中间-连接

应用实例

  1. 匹配汉字
content = "我爱学习";
regstr = "^[\u0391-\uffe5]+$";
Pattern pattern = Pattern.compile(regstr);//模式.编译
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
    System.out.println("找到:"+matcher.group());
}
找到:我爱学习
  1. 邮政编码

是一个0-9开头的六位数

content = "123456";
regstr = "^[0-9]\\d{5}$";
Pattern pattern = Pattern.compile(regstr);//模式.编译
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
    System.out.println("找到:"+matcher.group());
}
content = "123456";
regstr = "^[0-9]\\d{5}$";//加不加$都可以
Pattern pattern = Pattern.compile(regstr);//模式.编译
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
    System.out.println("找到:"+matcher.group());
}
  1. qq号码

一个1-9开头的一个5-10位数

regstr = "^[0-9]\\d{4,9}$";
  1. 手机号码

必须以13,14,15,18开头的11位数字

 regstr = "^1[3|4|5|8]\\d{9}$"; 
  1. url
content = "https://dtu.s.e/y/bi/my/0-9/index.html#39?fd=3e&sdf=23";
//注意 : [. ?] []中的所有字符仅代表本身含义
regstr = "^((https|http)://)([\\w-]+\\.)+([\\w-])+(\\/[?.\\w-&#/=]*)?";
  1. 经典的结巴程序

我…我要…学学学学…编程java!

我要学编程java!

content = "我...我要...学学学学...编程java!";
Pattern pattern = Pattern.compile("\\.");//模式.编译
Matcher matcher = pattern.matcher(content);
content = matcher.replaceAll("");//去除所有...
content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");//反向引用 将()中内容替换后面重复的字
System.out.println(content);

String 类中使用正则表达式

  1. 将文档中jdk1.3 jdk1.4 替换成jdk
content = "jdk1.3 jdk1.4";
String s = content.replaceAll("jdk1\\.3|jdk1\\.4", "jdk");
  1. 验证一个手机号码,必须是138 或 139开头
content = "13888887777";
boolean matches = content.matches("1(38|39)\\d{8}");
System.out.println(matches);
  1. 分割字符串 按照# - 数字 ~ 来分割
content = "java-jkd#sm~fd1212fd";
String[] split = content.split("#|-|~|\\d+");
for (String a : split){
    System.out.println(a);
}

本章练习题

  1. 匹配邮箱地址

只能有一个@ ;@前是用户名,可以是a-z A-Z 0-9 -_字符;@后是域名 并且域名只能是英文字母 比如 sohu.com tsingsf.org.cn

content = "sou@sou.com";
String regexx = "[\\w-]+@([a-zA-Z]+\\.)+[a-zA-Z]+";
System.out.println(content.matches(regexx));

content.matches()是全局匹配

最终调用的是Matcher.java 中 matches方法

  1. 要求验证是不是整数或者小数

略微复杂。。。

content = "+34.232";
regstr = "^[-+]?([1-9]\\d*|0)(\\.\\d+)?$";

以可有可无的-+符号, 1-9加若干数字或者只有一个0开头;以可有可无的.加至少一个数字结尾

  1. 对一个url进行解析

协议;域名;端口;文件名

content = "http://www.sohu.com:8080/abc/index.html";
regstr = "^(http|https)://([\\w.]+):(\\d+)[\\w/]+/([\\w.]+)$";
Pattern pattern = Pattern.compile(regstr);//模式.编译
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
    System.out.println("找到:"+matcher.group());
    System.out.println("找到协议:"+matcher.group(1));
    System.out.println("找到域名:"+matcher.group(2));
    System.out.println("找到端口:"+matcher.group(3));
    System.out.println("找到文件名:"+matcher.group(4));
}

找到:http://www.sohu.com:8080/abc/index.html
找到协议:http
找到域名:www.sohu.com
找到端口:8080
找到文件名:index.html

java 正则表达式大全

数字

在这里插入图片描述

汉字

在这里插入图片描述

特殊字符

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值