正则表达式

正则表达式

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);
    }
相关推荐
roman_日积跬步-终至千里1 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
野犬寒鸦1 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
wenzhangli71 小时前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
HalvmånEver1 小时前
Linux:线程互斥
java·linux·运维
rainbow68891 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
灵感菇_1 小时前
Java 锁机制全面解析
java·开发语言
indexsunny1 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
娇娇乔木2 小时前
模块十一--接口/抽象方法/多态--尚硅谷Javase笔记总结
java·开发语言
saber_andlibert2 小时前
TCMalloc底层实现
java·前端·网络
wangjialelele2 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先