Java正则表达式

编程 · 2023-10-10 · 198 人浏览

本地爬虫

  • Pattern:表示正则表达式
  • Matcher:文本匹配器,按照正则表达式的规则去读取字符串,从头开始读取,在大串中去找符合匹配规则的子串
package top.aboss;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Hello {
    public static void main(String[] args) {
        String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台。";

        // 1. 获取正则表达式对象
        Pattern p = Pattern.compile("Java\\d{0,2}");
        // 2. 获取文本匹配器对象
        Matcher m = p.matcher(str);
        // 3. 利用循环获取
        while (m.find()) {
            String s = m.group();
            System.out.println(s);
        }
    }
}

网络爬虫

package top.aboss;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Hello {
    public static void main(String[] args) throws IOException {
        // 创建URL对象
        URL url = new URL("https://www.cnblogs.com/longronglang/p/6429260.html");
        // 连接上这个网址
        URLConnection conn = url.openConnection();
        // 创建对象去读取网络中的数据
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        // 获取正则表达式对象pattern
        String regex = "[1-9]\\d{17}";
        Pattern pattern = Pattern.compile(regex);// 在读取的时候每次读一整行

        String line;
        while ((line = br.readLine()) != null) {
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()) {
                System.out.println(matcher.group());
            }
        }

        br.close();
    }
}

分组

每组是有组号的,也就是序号。

  • 规则1:从1开始,连续不间断
  • 规则2:以左括号为基准,最左边的是第一组,其次为第二组,以此类推

捕获分组

就是把这一组的数据捕获出来,再用一次。后续还要继续使用本组的数据,正则内部使用:\\组号,正则外部使用:$组号

package top.aboss;

public class Hello {
    public static void main(String[] args) {
        // 判断字符串开始和结束是否一致
        // \\组号 表示把第X组的内容再拿出来用一次
        String reg = "(.+).+\\1";
        System.out.println("a123a".matches(reg));
        System.out.println("abc123abc".matches(reg));

        // 判断字符串开始和结束是否一致,并且开始部分每个字符需要一致
        String reg2 = "((.)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(reg2));

        // 口吃替换
        String reg3 = "(.)\\1+";
        System.out.println("我要学学编编编编程程程程程程".replaceAll(reg3, "$1"));
    }
}

非捕获分组

分组之后不需要再用本组数据,仅仅是把数据括起来,特点是不占用组号。

package top.aboss;

public class Hello {
    public static void main(String[] args) {
        // 身份证号码简易正则表达式
        String reg = "[1-9]\\d{16}(?:\\d|X|x)";
        System.out.println("41080119930228457x".matches(reg));
    }
}

(?:) (?=) (?!)都是非捕获分组,更多的是使用第一个。

Java
Theme Jasmine by Kent Liao