你真的会用正则表达式么

正则表达式在Java中是一项强大的工具,用于文本处理和匹配,熟练使用正则表达式,将会让我们在文本处理代码时更加优雅。本文将介绍Java中正则表达式的基本概念、使用方法以及正则表达式应用案例。

一、什么是正则表达式?

正则表达式(Regular Expression),简称正则或RegExp,是一种用于描述文本模式的字符串工具。它由字符和操作符构成,用于匹配和操作字符串。正则表达式在文本搜索、替换、验证和分割等操作中非常有用。

二、正则表达式语法

下面是一些常见的正则表达式语法:
.:匹配任何字符(除了换行符)。
*:匹配前一个字符0次或多次。
+:匹配前一个字符1次或多次。
?:匹配前一个字符0次或1次。
[]:定义字符集,匹配其中任何一个字符。
[^]:定义字符集的补集,匹配不在字符集内的字符。
|:或操作,匹配两个表达式中的任何一个。
():分组操作,用于控制操作符的范围。
^:匹配字符串的开头。
$:匹配字符串的结尾。

三、Java中的正则表达式

在Java中,正则表达式的使用主要依赖于java.util.regex包。Java提供了两个主要类来处理正则表达式,详见JDK官网文档 正则表达式语法详解

Pattern:Pattern类用于表示正则表达式的编译形式。可以使用Pattern.compile()方法来将正则表达式编译成Pattern对象。

Matcher:Matcher类用于执行匹配操作。可以使用Pattern.matcher()方法来获取匹配器对象,然后使用匹配器执行匹配、查找、替换等操作。

四、示例:

1,验证邮箱地址的正则表达式:^[A-Za-z0-9+_.-]+@(.+)$
2,提取HTML链接的URL:<a\\s+href=["'](http[s]?://[^"']+)["']
3,验证IPv4地址的正则表达式:^(\d{1,3}\.){3}\d{1,3}$
4,提取出现两次的单词:\b(\w+)\b.*\b\1\b
5,提取JSON字符串的键名:"(\w+)":
6,验证日期的正则表达式(支持yyyy-MM-dd格式):^(?:\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1]))$
7,提取HTML图片的URL:<img\\s+src=["'](http[s]?://[^"']+)["']
8,验证URL的正则表达式:^(http|https):\/\/([a-zA-Z0-9.-]+)(:\d+)?(\/\w*)?$
9,提取HTML标题:<h[1-6]>(.*?)<\/h[1-6]>
10,提取以"www"开头的域名:www\.(.*?)\.(com|org|net)
11,验证十进制数的正则表达式:^-?\d+(\.\d+)?$
12,提取包含至少一个大写字母的单词:\b\w*[A-Z]+\w*\b
13,验证密码的正则表达式:^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@#$%^&+=]).{8,}$
14,提取HTML标签名称:<([a-z]+)[^>]*>
15,验证ISBN-13:^(?:\d-?){13}$
16,提取包含连续重复字母的单词:\b\w*(\w)\1\w*\b
17,提取符合驼峰命名规则的单词:[a-z][A-Z]\w+
18,验证HTML颜色代码的正则表达式:^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
19,提取HTML注释:<!--(.*?)-->

五、实战案例

1. 内容匹配

从给定内容中爬取出: 手机,邮箱,座机、400电话等信息,代码如下:

public class RegexTest {
    public static void main(String[] args) {
        // 从以下内容中爬取出: 手机,邮箱,座机、400电话等信息。
        String data = " 平台客服联系方式如下,\n" +
                "        电话:18888888888,19999999999\n" +
                "        联系邮箱:boss@ss.com,\n" +
                "        座机电话:0592-5555555,0592112134111\n" +
                "        邮箱:kefu@ss.com,\n" +
                "        邮箱:kefu66@ss.com,\n" +
                "        400热线:400-222-2222 ,400-333-3333,4006666666";
        String regex = "(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})|(\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2})"
                + "|(400-?\\d{3,7}-?\\d{3,7})";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(data); // 匹配正则
        while (matcher.find()) { // 循环匹配
            String rs = matcher.group();  // 获取匹配到的内容
            System.out.println(rs);
        }

    }
}

2. 内容提取

从给定内容中爬取出邮箱,并把邮箱的账户名取出,代码如下:

public class RegexTest {
    public static void main(String[] args) {
        String data = " 平台客服联系方式如下,\n" +
                "        电话:18888888888,19999999999\n" +
                "        联系邮箱:boss@ss.com,\n" +
                "        座机电话:0592-5555555,0592112134111\n" +
                "        邮箱:kefu@ss.com,\n" +
                "        邮箱:kefu66@ss.com,\n" +
                "        400热线:400-222-2222 ,400-333-3333,4006666666";
        // 1、定义爬取规则,每个邮箱规则有三部分组成,匹配到后可以分别取出三部分
        String regex = "(\\w{2,})@(\\w{2,20})(\\.\\w{2,10}){1,2}";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(data);
        // 2、循环爬取信息
        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)); // 取得匹配到的邮箱的第三组内容
        }
    }
   }

某系统的日志文件记录了进入系统的全部用户信息,需要把这些用户的名字爬取出来。代码如下:

public class RegexTest {
    public static void main(String[] args) {
        // 某系统的日志文件记录了进入系统的全部用户信息,需要把这些用户的名字爬取出来。
        String data = "欢迎张三访问交易系统!浏览了平台的商品...,欢迎庄子名访问交易系统!" +
                "欢迎展飞飞访问交易系统!浏览了平台的商品!欢迎本聪先生访问交易系统!下了500元的订单!";
        // 1、爬取规则
        String regex = "欢迎(.+?)访问"; // +? 非贪婪匹配
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(data);
        // 2、循环爬取
        while (matcher.find()) {
            System.out.println(matcher.group());
            System.out.println(matcher.group(1));
        }
    }
   }

3.搜索替换,内容分割

public class RegexTest {
    public static void main(String[] args) {
        // 请把张三丰889910ao赵本山xxoo8899刘德华888666郭大侠,中间的非中文字符替换成 “-”
        String str1 = "张三丰889910ao赵本山xxoo8899刘德华888666郭大侠";
        System.out.println(str1.replaceAll("\\w+", "-"));

        // 请把“我我我想去去去桂桂桂林林林!”,需要优化成“我想去桂林”。
        String str2 = "我我我想去去去桂桂桂林林林";

        System.out.println(str2.replaceAll("(.)\\1+", "$1"));

        // 请把张三丰889910ao赵本山xxoo8899刘德华888666郭大侠中的人名获取出来。
        String s3 = "张三丰889910ao赵本山xxoo8899刘德华888666郭大侠";
        String[] names = s3.split("\\w+");
        System.out.println(Arrays.toString(names));
    }
}

六、总结

正则表达式是Java中用于处理文本模式匹配的强大工具。它可以用于验证、搜索、替换和提取文本数据。正则表达式的语法初看显得复杂,但按文档练习,结合实际案例,也是很容易掌握,一旦掌握,它将成为文本处理的得力助手,让你的代码越发优雅。

关于正则表达式在使用过程中遇到的任何问题,欢迎评论留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老D不是传说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值