java正则表达式(Regular Express)

本文详细介绍了Java中的正则表达式,包括底层实现、语法、分组、限定符、定位符等概念,并通过实例解析了正则表达式的应用和常用类Pattern与Matcher的使用,以及反向引用的概念。
摘要由CSDN通过智能技术生成

目录

第一个例子

正则表达式的底层实现

正则表达式语法

字符匹配符

选择匹配符

限定符

定位符

捕获分组

非命名捕获

命名捕获

非捕获分组(特别分组)

非贪婪捕获

正则表达式应用

正则表达式三个常用的类

概述

pattern

matcher

反向引用


第一个例子

package dao.impl;

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

/**
 * @author 小李
 * @version 1.0
 * 体验正则表达式的威力,给我们的文本处理带来那些好处
 */
public class Regexp {

    public static void main(String[] args) {
        //假设,编写了爬虫,从百度页面得到如下文本
        String content = "建国初期,我们在小学教科书中崇拜那些为国家做出巨大贡献的人。来自黄继光、邱少云、雷锋和其他人的故事是必不可少的。" +
                "他们要么为新中国流血,要么为新中国的早期建设做出了巨大贡献。这自然值得学习。许多英雄故事被囊括在教科书中,供孩子们study。" +
                "但在此案中,一名man故意杀人,却以卑鄙的方式把自己打造成“人民英雄”,还登上了小学教科书。" +
                "这个人叫刘学保。他看到了一个流传广泛的英雄故事,觉得这种受到尊重和钦佩的感觉特别好。从此他开始走向邪恶的道路,依靠预谋杀人来伪造证据。" +
                "他把自己伪装成人民英雄,也受到人们的钦佩。然而,经过four year的研究和专家的考察,他的谎言最终弄巧成拙,成为了历史上的罪人,永远逃脱不掉杀人凶手的身份";
        //提取文章中的单词
        //1.传统方法。使用遍历方式,代码量大,效率不高。
        //2.正则表达式技术

        //1.先创建一个pattern模式对象,模式对象,可以理解为一个正则表达式对象
        Pattern pattern = Pattern.compile("[a-zA-Z]+");
        //2.创建一个匹配器对象,就是matcher匹配器按照 pattern(模式/样式),到content文本中去匹配。找到就返回true,否则false
        Matcher matcher = pattern.matcher(content);
        //开始循环匹配
        while(matcher.find()){
            //匹配内容,文本,放到m.group(0)
            System.out.println("找到:"+matcher.group(0));
        }

    }
}

为什么要学习正则表达式?

1.处理文本的利器

2.登录界面的密码,账号,邮箱,手机号码等的验证 

正则表达式的底层实现

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

public class RegTheory {
    public static void main(String[] args) {
        String context = "1998建国初期,我们在小学教科书中崇拜那些为国家做出巨大贡献的人。来自黄继光、邱少云、雷锋和其他人的故事是必不可少的。\" +\n" +
                "                \"他们要么为新中国流血,要么为新中国的早期建设做出了巨大贡献。这自然值得学习。许多英雄故事被囊括在教科书中,供孩子们study。\" +\n" +
                "                \"但在此案中,一名man故意杀人,却以卑鄙的方式把自己打造成“人民英雄”,还登上了小学教科书。\" +\n" +
                "                \"这个人叫刘学保。他看到了一个流传广泛的英雄故事,觉得这种受到尊重和钦佩的感觉特别好。从此他开始走向邪恶的道路,依靠预谋杀人来伪造证据。\" +\n" +
                "                \"他把自1111己伪装成人民英雄,也受到人们的钦佩。然而,经过four year的研究和专家的考察,他的谎言最终弄巧成拙,成为了历史上的罪人,永远逃脱不掉杀人凶手的身份";
        //匹配规则匹配所有的四个数字
        String regString = "\\d\\d\\d\\d";
        //创建模式对象
        Pattern pattern = Pattern.compile(regString);
        //创建匹配器matcher,按照正则表达式的规则,去匹配content字符串
        Matcher matcher = pattern.matcher(context);
        //开始匹配
        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}

matcher.find() 完成的任务(考虑分组):

什么是分组?

String regString = "(\\d\\d)(\\d\\d)";

group函数传值(0或者1或者2.............)这涉及到分组,正则表达式中有()表示分组,第一个()表示第一组,第二个()表示第二组。

1.根据指定的规则,来定位满足规则的子字符串(比如1998)

2.找到后,将子字符串的开始的索引记录到matcher对象的int[]  group属性中(如果之前执行过一次,下一次就会清空该数组,可以又下面断点调试证明)

        2.1 把该子字符串开始的索引记录到group[0] = 0,;把该子字符串的结束的索引+1的值记录到group[1]=4

        2.2 记录1组()匹配到的字符串group[2] = 0; group[3] = 2

        2.3 记录2组()匹配到的字符串group[4] =2;group[5] = 4; 

        2.4 如果有更多的分组。。。。,可以继续

3.同时记录oldlast的值为子字符串的结束的索引+1值为4,即下次执行find时候就从4开始匹配

group方法的源码

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 getSubSequen
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值