正则表达式

正则表达式

1.基本语法:符号即规则

1.1 匹配"单个字符"的元字符

1.2 控制"匹配次数"的元字符

2.爬取

2.1带条件爬取

java 复制代码
   String s = "java自从95年问世以来,经历了很多版本,目前企业中用的最多的是JAva8和Java11,"
            +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久JaVa17也会逐渐登上历史舞台";
//1.定义正则表达式
    //?理解问前面的数据Java
    //=表示在Java后面要紧随的数据
    //但是在获取的时候,只获取前半部分
    //?i忽视大小写
    //需求1. JAva  Java Java JaVa
    String rex1 = "(?i)(java)(?=11|17|8)";
    //需求2. JAva8 Java11 Java17 JaVa17
    String rex2 = "(?i)(java)(11|17|8)";
    String rex3 = "(?i)(java)(?11|17|8)";
    //需求3. java
    String rex4 = "(?i)(java)(?!11|17|8)";
    Pattern p = Pattern.compile(rex4);
    Matcher m = p.matcher(s);
    while(m.find()){
        System.out.println(m.group());
    }
}

2.2贪婪爬取

贪婪爬取:在爬取数据的时候尽可能多的获取数据

非贪婪爬取:在爬取数据的时候尽可能少的获取数据

java 复制代码
public static void main(String[] args) {
    //贪婪爬取:在爬取数据的时候尽可能多的获取数据
    //非贪婪爬取:在爬取数据的时候尽可能少的获取数据
    String s = "abbbbbbbbbbb";
    String rex1 = "ab+";//abbbbbbbbbbb
    String rex2 = "ab+?";//ab
    //1,先创建正则表达式的对象
    Pattern p = Pattern.compile(rex2);
    //2.创建一个文档扫描器,利用m在s中寻找p规则的字符串
    Matcher m = p.matcher(s);
    while (m.find()) {
        System.out.println(m.group());
    }
}

3.替换和分割

Java 复制代码
String S = "adfnefnsef小白daafawf小兰";
//1.按照正则表达式的规则进行替换
  String vs = S.replaceAll("[\\w&&[^_]]+", "vs");
  System.out.println(vs);//vs小白vs小兰
  //2.按照正则表达式的规则就行分割
  String[] split = S.split("[\\w&&[^_]]+");
  for (int i = 0; i < split.length; i++) {
      System.out.println(split[i]);//小白  小兰
  }

4.分组

组号的特点: 从1开始,连续不间断

​ 以左括号为基准,最左边的是第一组

4.1捕获性分组

捕获分组:判断一个字符串的开始部分和结尾部分是否一致?可以有多个字符

正则内部使用:\\组好

正则外部使用:$组好

Java 复制代码
 //捕获分组
        //判断一个字符串的开始部分和结尾部分是否一致?可以有多个字符
        String s  = "asd123a";
        String z  = "bbb123bbb";
        String d  = "dsd123dsd";
        String rex1 = "(.)+.+\\1";
        boolean result = s.matches(rex1);
        System.out.println(result);
        // (.)把首字符看成一组
        // \\1把首字符拿出来再次使用
        //  * 作用于\\1 表示后面重复的内容重复0次或多次
        String rex2 = "((.)\\2*).+\\1";
        boolean result2 = z.matches(rex2);
        System.out.println(result2);//true
        String  rex3 = "(.+).+\\1";
        boolean result3 = d.matches(rex3);
        System.out.println(result3);
// 后续还要继续使用本组的数据
        //正则内部使用:\\组好
        //正则外部使用:$组好	
        String rex4 = "我我我要学学学编程";
        String s1 = rex4.replaceAll("(.)\\1+", "$1");
        System.out.println(s1);//我要学编程

4.2非捕获性分组

非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来

Java 复制代码
//非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来
        //(?:正则) 获取所有
        //(?=正则) 获取前面部分
        //(?!正则) 获取不是置顶内容的前面部分
        //特点不占用组号
        //\\1 报错的原因是(?:)非捕获分组,此时是不占用组号
        String rex5 ="[1-9]{16}(?:\\d|x|X)\\1";
        boolean matches = s.matches(rex5);
    }
相关推荐
无心水4 小时前
微服务架构下Dubbo线程池选择与配置指南:提升系统性能与稳定性
java·开发语言·微服务·云原生·架构·java-ee·dubbo
Chan164 小时前
《Java并发编程的艺术》| 并发关键字与 JMM 核心规则
java·开发语言·数据库·spring boot·java-ee·intellij-idea·juc
期待のcode4 小时前
线程睡眠sleep方法
java·开发语言
汤姆yu4 小时前
基于springboot的植物花卉销售管理系统
java·spring boot·后端
不想写bug呀4 小时前
RabbitMQ相关问题(1)
java·rabbitmq
海南java第二人4 小时前
Spring Boot Starters深度解析:简化依赖管理的核心利器
java·spring boot·后端
captain3764 小时前
Java-链表
java·开发语言·链表
tqs_123454 小时前
跳出多层循环的方式
java·开发语言
东方轧线4 小时前
突破锁竞争的性能枷锁:深度剖析 C++ 内存模型与无锁编程在超大规模并行 AI 系统中的极致应用实践
java·c++·人工智能