分组,捕获,反向引用以及String类中使用
  TEZNKK3IfmPf 2023年11月13日 20 0

请看下面问题:

给你一段文本请你找出所有四个数字连在一 起的子串,并且这四个数字要满足①第1位与第4位相同②第2位与第3位相同,比如1221,5775,……

2. 介绍  896

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

1. 分组

我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式/一 个分组。

2.捕获

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

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

3.反向引用

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

3. 看几个小案例  897

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

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

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

4.思考题 

请在字符串中检索商品编号,形式如:12321-333999111这样的号码,要求满足前面是一个五位数,然后一 个-号,然后是一个九位数,连续的每三位要相同

代码在com.stulzl.regexp14

Regexp14

package com.stulzl.regexp14;

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

//反向引用   897
public class Regexp14 {
    public static void main(String[] args) {
        String content = "h1234el9876lo33333 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-333999111这样的号码,要求满足前面是一个五位数
        // ,然后一 个-号,然后是一个九位数,连续的每三位要相同
        String regStr = "\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while(matcher.find()){
            System.out.println("找到 "+matcher.group(0));
        }
    }
}

4. 经典结巴程序   898

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

通过正则表达式 修改成 "我要学编程 java"

代码在 com.stulzl.regexp15

Regexp15

package com.stulzl.regexp15;

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

//经典结巴程序  898
public 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. String 类中使用正则表达式    899

5.1 替换功能 

String 类 public String replaceAll(String regex,String replacement) 

5.2 判断功能 

String 类 public boolean matches(String regex){} //使用 Pattern 和 Matcher 类 

5.3 分割功能 

String 类 public String[] split(String regex)

5.1 5.2 5.3代码在com.stulzl.regexp_string   899

StringRegexp

package com.stulzl.regexp_string;

//String 类中使用正则表达式  899
public 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 发" +
                "布。2002 年 2 月 26 日,J2SE1.4 发布。自此 Java 的计算能力有了大幅提升";

        //使用正则表达式将JDK1.3、JDK1.4替换成JDK
        content = content.replaceAll("JDK1\\.3|JDK1\\.4","JDK");
        System.out.println(content);

        //要求 验证一个 手机号, 要求必须是以 138 139 开头的
        content = "13888889999";
        if(content.matches("1(38|39)\\d{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);
        }
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   21天前   48   0   0 java
TEZNKK3IfmPf