当前位置: 首页 > 图灵资讯 > 技术篇> 分组,捕获,反向引用以及String类中使用

分组,捕获,反向引用以及String类中使用

来源:图灵教育
时间:2023-05-29 13:52:22

1.提出要求896

请参见以下问题:

给你一段文本,请找出所有四个数字连接在一起的子串,这四个数字应该满足①第一个和第四个一样②第二位和第三位一样,比如1221,5775...

2.介绍896

要解决以前的问题,我们需要了解几个正则表达式的概念:

1.分组

我们可以用圆括号形成复杂的匹配模式,所以我们可以把圆括号的一部分看作是子表达式/分组。

2.捕获

将正则表达式中子表达式/分组匹配的内容保存在以数字编号或显式命名的内存组中,便于以后引用,从左到右,以分组的左括号为标志,第一组的组号为1,第二组为2,以此类推。组0代表整个正则

分组,捕获,反向引用以及String类中使用_System

3.反向引用

圆括号的内容被捕获后,可以在这个括号后使用,从而写出更实用的匹配模式,我们称之为反向引用这种引用既可以在正则表达式内,也可以在正则表达式外,内反向引用\\分组号,外反向引用$分组号

3.8977看几个小案例

1.匹配两个连续的相同数字:(\\d)\\1

2.匹配五个连续的相同数字:(\d)\\1{4}

3.匹配个位与干位相同,十位数与百位数相同,525,1551(\d)(\\d)\\2\\1

4.思考题

请以12321-33399111等形式检索字符串中的商品号,要求满足前面的五位数,然后是一个-号,然后是一个九位数,连续三位数应相同

com中的代码.stulzl.regexpp14Regexpp14

package com.stulzl.regexp14;import java.util.regex.Matcher;import java.util.regex.Pattern;///反向引用   897public class Regexp14 {    public static void main(String[] args) {        String content = h1234el9876lo333 j12321-333999111a1551ck tom11 jack22 yyy12345 xxx";        //1.匹配两个连续的相同数字: (\\d)\\1        //String regStr = "(\\d)\\1";        //2.匹配五个连续的相同数字: (\\d)\\1{4}        //String regStr = "(\\d)\\1{4}";        //3.匹配与干位相同的位置,与百位数相同的十位数5225, 1551 (\\d)(\\d)\\2\\1        //String regStr = "(\\d)(\\d)\\2\\1";        //请以12321-33399111等形式检索字符串中的商品号码,满足前面五位数的要求        // ,然后一 个-号,然后是九位数,每三个连续的位置应该是一样的        String regStr = "\\d{5}-(\\d)\\\\\d)\\\\\d)\\3{2}";        Pattern pattern = Pattern.compile(regStr);        Matcher matcher = pattern.matcher(content);        while(matcher.find()){            System.out.println("找到 "+matcher.group(0));        }    }}

4.8988经典结巴程序

类似:“我...我要...学学学学...编程java!";

通过正则表达式修改为“我想学编程java”

com中的代码.stulzl.regexp15regexp15

package com.stulzl.regexp15;import java.util.regex.Matcher;import java.util.regex.Pattern;//经典结巴程序  898public class Regexp15 {    public static void main(String[] args) {        //把类似 : "我...我要...学学学学...编程 java!";        //通过正则表达式 修改成 “我要学编程 java"        String content = "我...我要...学学学学...编程 java!";        //1 去掉所有的..        Pattern pattern = Pattern.compile("\\.");        Matcher matcher = pattern.matcher(content);        content = matcher.replaceAll("");//        System.out.println("content="+content);        //2 去掉重复的单词  我想学编程 java!        // 思路        //(1) 使用 (.)\\1+ 解释:.可以代表除了\n之外的所有字符,然后反向引用即\1        //   (这里反向引用一次,有两个相同的例子:我和我)后面的+代表反向引用可以多次使用        //(2) 使用 反向引用$1 替换匹配的内容        // 注:由于正则表达式的变化,需要重置 matcher//        pattern = Pattern.compile("(.)\\1+");///分组的捕获内容记录在$1//        matcher = pattern.matcher(content);//        while(matcher.find(){/////)            System.out.println(”找=”+matcher.group(0));//        }//        //使用 反向引用$1 替换匹配的内容///        //解释:因为之前的(.)是分组捕获,就会捕获 我  和  学 两个字,///        // 然后(.)\1+发现的 我我 学学学学,它将被$1外部反向引用 我 学 二字替换/////        content = matcher.replaceAll("$1");//        System.out.println("content="+content);        //3 用句子来解决重复汉字的问题   我想学编程 java!        content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");        System.out.println("comtent="+content);    }}

5.正则表达式899在String类中使用5.1替换功能

String类publicStringreplaceAll(Stringregex,Stringreplacement)

5.2判断功能

String类publicbooleanmatches(Stringregex){}//使用Pattern和Matcher

5.3分割功能

String类publicString[]split(Stringregex)

comm代码5.15.25.3.stulzl.regexp_string8999StringRegexp

package com.stulzl.regexp_string;//String 正则表达式用于类别  899public class StringRegexp {    public static void main(String[] args) {        String content = "2000 年 5 月,JDK1.3、JDK1.4 和 J2SE1.3 几周后相继发布,其“ +                "获得了 Apple 公司 Mac OS X 支持工业标准。2001 年 9 月 24 日,J2EE1.3 发" +                "布。2001 年 9 月 24 日,J2EE1.3 发" +                "布。2002 年 2 月 26 日,J2SE1.4 发布。自此 Java 计算能力大大提高”;        ///使用正则表达式JDK1.3、JDK1.用JDK代替4        content = content.replaceAll(JDK1\.3|JDK1.4","JDK");        System.out.println(content);        //要求 验证一个 手机号, 要求必须是以 138 139 开头的        content = "13888889999";        if(content.matches(1)38|39d{8}")){            System.out.println(“验证成功”);        }else{            System.out.println(“验证失败”);        }        //按要求 # 或者 - 或者 ~ 或者 数字 来分割        System.out.println(======================);        content = "hello#abc-jack12smith~北京”;        String[] split = content.split(#|||||||||||||||||||d+");        for (String s : split) {            System.out.println(s);        }    }}