Java正则表达式

37次阅读
没有评论

共计 2008 个字符,预计需要花费 6 分钟才能阅读完成。

本地爬虫

  • 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));
    }
}

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

正文完
post-qrcode
 0
三毛
版权声明:本站原创文章,由 三毛 于2023-10-10发表,共计2008字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)