首页 > 其他分享 >分组,捕获,反向引用以及String类中使用

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

时间:2023-05-29 14:02:04浏览次数:39  
标签:java String matcher System content 分组 学学 类中

1. 提出要求  896

请看下面问题:

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

2. 介绍  896

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

1. 分组

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

2.捕获

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

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

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);
        }
    }
}

标签:java,String,matcher,System,content,分组,学学,类中
From: https://blog.51cto.com/u_15784725/6370445

相关文章

  • CodeForces 1830C Hyperregular Bracket Strings
    洛谷传送门CF传送门每一步思路都非常自然的题。考虑先从一些简单的case入手。1.\(k=0\)设\(g_i\)为长度为\(i\)的合法括号串数。显然\(\foralli\nmid2,g_i=0\)。对于偶数的\(i\),这是一个经典问题,\(g_i\)就是第\(\frac{i}{2}\)项卡特兰数,因此\(g_i=\bi......
  • JSON.parse 和 JSON.stringify()
    这篇文章主要介绍了JSON.parse()和JSON.stringify()使用。parse用于从一个字符串中解析出json对象,如varstr='{"name":"huangxiaojian","age":"23"}'结果:JSON.parse(str)Objectage:"23"name:"huangxiaojian"__proto__:Object注......
  • String验证码案例
    packagecom.String;importjava.util.Random;publicclassSrtingDemo2{//验证码publicstaticvoidmain(String[]args){System.out.println(createCode(4));System.out.println(createCode(6));}//设计一个方法,返回指定位数的......
  • String使用时的几个注意事项
    packagecom.String;publicclassSrtingDemo1{publicstaticvoidmain(String[]args){//String使用时的几个注意事项//1.String的对象是不可变的Stringname="黑马";name+="程序员";name+="波妞";......
  • 快速熟悉String提供的处理字符串的常用方法
    packagecom.String;publicclassStringDemo{publicstaticvoidmain(String[]args){//快速熟悉String提供的处理字符串的常用方法Strings="黑马java";//1.获取字符串长度System.out.println(s.length());//2.提取字......
  • String案例
    packagecom.String;importjava.util.Scanner;publicclassuserDemo{publicstaticvoidmain(String[]args){for(inti=0;i<3;i++){Scannersc=newScanner(System.in);System.out.println("请您输入登录名称:");......
  • 8)排序、分组
    1、排序orderby:orderby:按照给定的字段或字段列表对结果集进行排序;asc是默认缺省值,升序排列;desc表示降序排序;orderby{col_name|expr|position}{[asc]|desc}[,{col_name|expr|position}{[asc]|desc},...]1)单列排序:select*fromchooseorderbysc......
  • substr()与substring()的区别
    在JavaScript编程语言中,substr()和substring()都是字符串函数,用于截取指定位置的子字符串。虽然这两个函数都可以用于截取字符串,但它们之间存在一些区别。substr(startIndex,length)函数:该函数返回从起始索引开始的指定长度的子字符串。其中,startIndex参数表示要截取的子......
  • 647. Palindromic Substrings刷题笔记
    用动态规划可以做,应该可以优化为只有两个表,而且不用每次res都加classSolution:defcountSubstrings(self,s:str)->int:n=len(s)dp=[[0]*nfor_inrange(n)]res=0foriinrange(n-1,-1,-1):forji......
  • EasyCVR视频融合平台设备分组共享功能的使用介绍
    EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议、多类型的设备接入,并能对设备进行分级、分组管理,并支持权限、角色分配,属于功能全面、性能稳定、高可靠、高可用的流媒体视频云服务平台。很多用户都使用过平台的......