正则表达式-入门

什么是正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式是对字符串执行模式匹配的技术


快速入门

基本使用

        String str = "1995年";
        //\\d表示任意一个数字
        String regStr = "\\d\\d\\d\\d";//表示四个数字连在一起
        //括号()代表分组
        //创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        //创建匹配器
        Matcher matcher = pattern.matcher(str);
        //开始匹配
        while(matcher.find()){
            System.out.println("找到:"+matcher.group());//matcher.group(1):代表第一组
        }

正则表达式语法

  • 限定符
  • 选择匹配符
  • 分组组合和反向引用
  • 特殊字符
  • 字符匹配符
  • 定位符

元字符-转义符

java的正则表达式中"\"代表其他语言的""

需要用到的转义字符:. * + ( ) $ / \ ? [ ] ^ { }

限定符

*:指定字符重复0或n次(无要求)零到多

+:指定字符重复1次或n次(至少一次)1到多

?:指定字符重复0次或1次(最多一次)0到1

{n}:只能输入n个字符

{n,}:指定至少n个字符

{n,m}:指定至少n个但不多于m个匹配

选择匹配符

|:|前或后的符号

分组组合和反向引用符

常用分组的构造形式
(pattern):非命名捕获.捕获匹配的自字符串.编号为0的第一个捕获是由整个正则表达式匹配模式的文本,其他捕获结果则根据左括号的顺序从1开始自动编号

(?<name>pattern):命名捕获.将匹配的子字符串捕获到一个组名抽或者编号名称中.用于name的字符串不能将包含任何把标点斌不能包含任何标点,并不能数字开头,可以使用单引号或者尖括号
特别分组
![](https://secure2.wostatic.cn/static/2pygfWwUeMXkr71ebf3g51/image.png?auth_key=1728117643-4haVcn7QnRw85bZvDH9GKZ-0-01b91ef6d673100c9e36b5621112384b)

特殊字符

字符匹配符

.:代表所有字符

[ ]:可接受的字符列表

[^]:不可接受的字符列表

-:连字符

[efgh]:e,f,g,h的任意字符

[^abc]:除了abc之外任意一个字符,包括数字和特殊字符

A-Z:任意单个大写字母

.:匹配除\n以外的任何字符:a..b:以a开头以b结尾的四个字符串

\\d:匹配单个字符相当于[0-9]

\\D:相当于[^0-9]

\\w:相当于[0-9a-zA-Z_]

\\W:相当于[^0-9a-zA-Z_]

\\s:空白字符,(空格,制表符)

\\S:对\s取反

java正则表达式默认是区分字母大小写的,如何实现不区分大小写

  • (?i)abc:表示abc都不区分大小写 a(?i)bc:表示bc不区分大小写 a((?i)b)c:表示只有b不区分大小写 +Pattern pat = Pattren.compile(regEX,Pattern.CASE_INSENSITIVE);

定位符

^:指定起始字符

$:指定结束字符

\\b:匹配目标字符串边界

\B:匹配目标字符的非边界


取消贪婪匹配

在限定符后面:+? 比如\\d+?

简单应用

               //汉字
//        String content = "安徽工业经济职业技术学院";
//        String regStr = "^[\u0391-\uffe5]+$";
//        String content = "235300";//邮政编码
//        String regStr = "^[1-9]\\d{5}$";
//        String content = "1650387911";//qq号码
//        String regStr = "^[1-9]\\d{4,9}$";
//        String content = "13499332134";
//        String regStr = "^1[3|4|5|8]\\d{9}$";
        String content = "https://blog.csdn.net/blue_show/article/details/126908597";
        String regStr = "^((http|https)://)(([\\w-])+\\.)+(\\/[\\w-?=&/%.#]*)?$";
        if (Pattern.compile(regStr).matcher(content).find()){
            System.out.println("满足");
        }else {
            System.out.println("不满足");
        }

正则表达式三个常用类

Pattern

Pattren 对象是一个正则表达式对象,Pattren类没有公共构造方法,要创建一个Pattern 对象,调用其公共静态方法,它返回一个Pattern 对象,该方法接收一个正则表达式作为它的一个参数,

比如:`Pattern r = Pattern.compile(pattern)`
        String content = "anhiu";
        String regStr = "anhiu";
        boolean matches = Pattern.matches(regStr, content);
        System.out.println(matches);//true

Matcher

Matcher 对象是对输入字符串进行解释和匹配的引擎,与Pattern 类一样,Matcher也没有公共构造方法,你需要调用Pattern对象的matcher方法来获取一个Matcher对对象
int start()返回以前匹配的初始索引
int start(int group)返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
int end(int group)返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量
int end()返回最后匹配字符之后的偏移量
boolean find()尝试查找与该模式匹配的输入序列的下一个子序列
boolean find(int start)重置匹配器,然后尝试查找匹配该模式,从指定索引开始的输入序列的下一个子序列
boolean matches()尝试将整个区域与模式匹配
String replaceAll(String replacement)替换模式与给定替换字符串想匹配的输入序列的第一个子序列

PatternSyntaxExcrption

`PatternSyctaxEcxeption`是一个非强制异常类,它表示一个正则表达式模式中的语法错误

分组,捕获,反向引用

  • 分组:我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看做是一个子表达式/分组
  • 捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组名,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推,组0表示的是整个正则式
  • 反向引用:圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以式在正则表达式内部,也可以是在正则表达式外部,内部反向引用\分组号,外部反向引用¥分组号
  String content = "hello33333 jack2332 tom11 jack22 yyy xxx";
        String regStr = "(\\d)\\1";//匹配两个连续相同的数字
        String regStr1 = "(\\d)(\\d)\\2\\1";//个位和千位相同的
        Pattern compile = Pattern.compile(regStr1);
        Matcher matcher = compile.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

结巴去重

public static void main(String[] args) {
        String content = "我我我.....要要要......学学";
        String regStr1 = "\\.";//个位和千位相同的
        Pattern pattern = Pattern.compile(regStr1);
        Matcher matcher = pattern.matcher(content);
        content = matcher.replaceAll("");
        System.out.println("去点:"+content);
        //去重
//        pattern = Pattern.compile("(.)\\1+");
//        matcher = pattern.matcher(content);
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//        }
//        //使用反向引用$1来替换匹配的内容
//        content=matcher.replaceAll("$1");
//        System.out.println(content);
         content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
        System.out.println(
                content
        );
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值