正则表达式

本文详细介绍了Java正则表达式的快速入门、基本语法、应用实例和常用类,包括元字符、分组、非贪婪匹配,以及在实际场景中的验证和处理,如邮箱、电话号码和URL的验证。
摘要由CSDN通过智能技术生成

正则表达式

1. 快速入门

package com.example.mhl_demo.day01;

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

/**
 * 测试使用正则表达式
 */
public class RegexpTest {
   

    public static void main(String[] args) {
   
        String content = "1995年,互联网的蓬勃发展给了Oak机会。" +
                "业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序," +
                "这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了" +
                "大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak," +
                "并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台" +
                "体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言," +
                "程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上" +
                "传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术)," +
                "并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后," +
                "最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语)。5月23日," +
                "Sun公司在Sun world会议上正式发布Java和HotJava浏览器。" +
                "IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了" +
                "自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。";

        //1. 先创建一个Pattern对象,模式对象,可以理解成就是一个正则表达式对象
        //Pattern pattern = Pattern.compile("[a-zA-Z]+");
        //匹配所有的数字
        //Pattern pattern = Pattern.compile("[0-9]+");
        //匹配所有的数字或者单词
        Pattern pattern = Pattern.compile("([0-9]+)|([a-zA-Z]+)");
        //创建一个匹配器对象
        //理解:就是 matcher 匹配器按照 pattern(模式/样式),到content 文本中去匹配

        Matcher matcher = pattern.matcher(content);
        //3. 可以开始匹配
        while (matcher.find()){
   
            //匹配内容,文本,放到m.group(0)
            System.out.println("找到:" + matcher.group(0));
        }

    }

}

2. 基本介绍

一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后,就觉得这些复杂的表达式写起来还是相当简单的。

源码分析

package com.example.mhl_demo.day01;

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

public class RegexpDemo2 {
   
    public static void main(String[] args) {
   
        String content = "1995年,互联网的蓬勃发展给了Oak机会。" +
                "业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序," +
                "这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了" +
                "大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak," +
                "并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台" +
                "体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言," +
                "程序非常小,2323适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上" +
                "传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术)," +
                "并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后," +
                "最终,使用了提议者在喝一杯Java咖啡时无2346意提到的Java词语)。5月23日," +
                "Sun公司8787在Sun world会议上正式发布Java和HotJava浏览器。" +
                "IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了" +
                "自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。";

        //目标:找到所有的四个数字
        //说明:\\d 表示任意一个数字
        //String regStr = "\\d\\d\\d\\d";
        //分组
        String regStr = "(\\d\\d)(\\d\\d)";
        //创建模式对象[及正则表达式对象]
        Pattern pattern = Pattern.compile(regStr);
        //创建匹配器matcher , 按照 正则表达式的规则,去匹配 content字符串
        Matcher matcher = pattern.matcher(content);

        /**
         * 源码分析:
         *  (1)find() :
         *      1. 根据指定的规则,定位满足规则的子字符串
         *      2. 找到后,将子字符串的开始的索引记录在 matcher 兑现的属性 int[] groups中
         *          2.1 groups[0] = 0 , 把该字符串的结束的索引 + 1 记录到groups[1]= 4中
         *          2.2 如果正则表达中有(小括号:代表分组)
         *              2.2.1 记录第一组小括号匹配的字符串到 groups[2] 和 groups[3]
         *              2.2.2 记录第二组小括号匹配的字符串到 groups[4] 和 groups[5]
         *              ……
         *
         *  (2) matcher.group(0)
         *     public String group(int group) {
         *         if (first < 0)
         *             throw new IllegalStateException("No match found");
         *         if (group < 0 || group > groupCount())
         *             throw new IndexOutOfBoundsException("No group " + group);
         *         if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
         *             return null;
         *         return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
         *     }
         *
         *     截取关键点:getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString()
         *     当 group = 0 的时候, 截取的是 groups[0] , groups[1]
         *     当 group = 1 的时候, 截取的是 groups[2] , groups[3]
         *     当 group = 2 的时候, 截取的是 groups[4] , groups[5]
         *     如果有更多的组,以此类推
         *
         *     groups[0],groups[1] 中永远记录的是 符合整个正则表达式的索引
         *     其余的都是分组匹配的索引
         */

        //开始匹配
        while (matcher.find()){
   
            System.out.println("找到: " + matcher.group(0));
            System.out.println("找到第一组: " + matcher.group(1));
            System.out.println("找到第二组: " + matcher.group(2));
        }
    }
}

image-20211120085149410

3. 语法

3.1 元字符 - 转义号 (\\)

\\说明: 在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错。

案例: 用 $ 去匹配 abc$( 会怎样?

提示:在java的正则表达式中,两个 \\代表其他语言中的一个 \

/**
 * 转移符号 \\
 */
public static void fun1() {
   
    String content = "abc$(abc(123(";
    String regStr = "\\(";

    Pattern pattern = Pattern.compile(regStr);

    Matcher matcher = pattern.matcher(content);

    while (matcher.find()) {
   
        System.out.println("找到: " + matcher.group(0));
    }
}

3.2 元字符 - 匹配符

符号 说明 示例 解释
[ ] 可接受的字符列表 [efgh]、[a-z] e、f、g、h中的任意字符
[^] 不可接受的字符列表 [^abc] 除a、b、c之外的任意一个字符,包括
数字和特殊符号
- 连字符 A-Z 任意单个大写字母
符号 含义 示例 说明 匹配输入
. 匹配除\n 以外的字符 a…b 以a开头,b结尾,中间包括
2个任意字符的长度为4
的字符串
aaab
\\d 匹配单个数字字符,相当于
[0-9]
\\d{3}(\\d)? 包含3个或四个数字的字符串 123,9876
\\D 匹配单个非数字字符,相当于
[^0-9]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值