Java正则表达式学习笔记(二)

目录

一:正则表达式应用实例

二:正则表达式三个常用的类

三:分组、捕获、反向引用

五:String类中使用正则表达式

六:正则表达式练习题


一:正则表达式应用实例

Java正则表达式学习笔记(二)_第1张图片

1.1 验证汉字:

 public static void main(String[] args) {
        //1.验证汉字
        String content="周嘉兴aa教育";
        String regExp="^[\u0391-\uffe5]+$";
        Pattern pattern=Pattern.compile(regExp);
        Matcher matcher=pattern.matcher(content);
        if(matcher.find()){
            System.out.println("该字符串是由汉字组成的");
        }else {
            System.out.println("该字符串不是由汉字组成的");
        }

        
    }

 1.2 验证邮政编码:(是由(1-9)开头的6位数,比如123890)

//2.验证邮政编码
        String content="123890";
        String regExp="^[1-9]\\d{5}$";
        Pattern pattern=Pattern.compile(regExp);
        Matcher matcher=pattern.matcher(content);
        if(matcher.find()){
            System.out.println("该字符串是由一段数字串组成的");
        }else {
            System.out.println("该字符串不是由一段数字串组成的");
        }

1.3 验证QQ号:(是由(1-9)开头的5位至10位数)

 //3.验证QQ号
        String content="1238900000";
        String regExp="^[1-9]\\d{4,9}$";
        Pattern pattern=Pattern.compile(regExp);
        Matcher matcher=pattern.matcher(content);
        if(matcher.find()){
            System.out.println("该字符串是由QQ号组成的");
        }else {
            System.out.println("该字符串不是由QQ号组成的");
        }

1.4 手机号码:(必须以13,14,15,18开头的11位数)

// 4.手机号码:(必须以13,14,15,18开头的11位数)
        String content="13389000000";
        String regExp="^1[3458]\\d{9}$";
        Pattern pattern=Pattern.compile(regExp);
        Matcher matcher=pattern.matcher(content);
        if(matcher.find()){
            System.out.println("该字符串是由手机号组成的");
        }else {
            System.out.println("该字符串不是由手机号组成的");
        }

1.5 验证URL:

//5.验证URL:(https://www.bilibili.com/video/BV1Eq4y1E79W?p=17&spm_id_from=pageDriver)
        String content="https://www.bil-ibili.com/video/-BV1Eq4y1E79W?p=17&spm_id_from=pageDriver";
    //    String content="https://www.biblibili.com";

      //  String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-\\?/]+$";
       // String regExp="^(https|http)://(\\w+\\.)(.+)$";  // -----(成功)

        //标准格式:(注意:[.?*]表示匹配就是.本身)
        String regExp="(^((https|http)://))?([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$";

        Pattern pattern=Pattern.compile(regExp);
        Matcher matcher=pattern.matcher(content);
        if(matcher.find()){
            System.out.println("该字符串是由URL组成的");
        }else {
            System.out.println("该字符串不是由URL组成的");
        }

二:正则表达式三个常用的类

java.util.regex包主要包括以下三个类:Pattern类、Matcher类和PatternSyntaxException类

2.1 Pattern类:

pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对象,调用其公共静态方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数,比如:Pattern r=Pattern.compile(pattern);

Pattern类的方法matches:(重点)

Java正则表达式学习笔记(二)_第2张图片

可以用 matches方法来根据我们的需求来判断字符串的类型。

2.2 Matcher类:

Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象

Matcher类的方法及说明:

Java正则表达式学习笔记(二)_第3张图片

Java正则表达式学习笔记(二)_第4张图片

2.3 PatternSyntaxException类:

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

三:分组、捕获、反向引用

Java正则表达式学习笔记(二)_第5张图片

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

1.分组:

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

2.捕获:

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

3.反向引用:

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

4.案例:

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

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

public class RegExp10 {
    public static void main(String[] args) {
        //1.匹配两个连续的相同数字
        String content="1111";
        String regStr="(\\d)\\1";
        /*Pattern pattern=Pattern.compile(regStr);
        Matcher matcher=pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }*/
        //可以判断一个两位数的各个数字是否相同
        if(Pattern.matches(regStr,content)){
            System.out.println("yes");
        }else {
            System.out.println("no");
        }
    }
}

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

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

public class RegExp10 {
    public static void main(String[] args) {
        //2.要匹配五个连续的相同数字
        String content="11111";
        String regStr="(\\d)\\1{4}";
        /*Pattern pattern=Pattern.compile(regStr);
        Matcher matcher=pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }*/
        //可以判断一个两位数的各个数字是否相同
        if(Pattern.matches(regStr,content)){
            System.out.println("yes");
        }else {
            System.out.println("no");
        }
    }
}

4.3 要匹配个位与千位相同,十位与百位相同的数5225,1551:(\\d)(\\d)\\2\\1

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

public class RegExp10 {
    public static void main(String[] args) {
        //3.要匹配个位与千位相同,十位与百位相同的数5225,1551
        String content="5225";
        String regStr="(\\d)(\\d)\\2\\1";
        /*Pattern pattern=Pattern.compile(regStr);
        Matcher matcher=pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }*/
        //可以判断一个两位数的各个数字是否相同
        if(Pattern.matches(regStr,content)){
            System.out.println("yes");
        }else {
            System.out.println("no");
        }
    }
}

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

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

public class RegExp10 {
    public static void main(String[] args) {
        //.4 请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个5位数,然后一个-号,然后是一个九位数,连续的每三个要相同
        String content="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));
        }*/
        //可以判断一个两位数的各个数字是否相同
        if(Pattern.matches(regStr,content)){
            System.out.println("yes");
        }else {
            System.out.println("no");
        }
    }
}

4.5 经典的结巴程序:

Java正则表达式学习笔记(二)_第6张图片

package regexp;

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

public class RegExp10 {
    public static void main(String[] args) {
        //.5.将“我...我要...学学学学...编程java”通过正则表达式修改成“我要学编程java”;

        //1.首先,先消去字符串中所有的.
        String content="我...我要...学学学学...编程java";
        String regStr="\\.";
        Pattern pattern=Pattern.compile(regStr);
        Matcher matcher=pattern.matcher(content);
        content=matcher.replaceAll("");

        /*
        //2.去掉所有重复的字:我我要学学学学编程java
        //思路:
        //(1)使用(.)\\1+
        //(2)使用反向引用$1来替换匹配到的内容

        //注意:因为正则表达式变化,所以需要重置matcher
        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);

         */
        //使用一条语句,去掉重复的字,我我要学学学学编程java
        content=Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
        System.out.println(content);
    }
}

五:String类中使用正则表达式

5.1 案例1:实现替换功能:

Java正则表达式学习笔记(二)_第7张图片

package regexp;

import java.util.regex.Pattern;

public class RegExp11 {
    public static void main(String[] args) {
        String content="JDK1.4,JDK1.5,JDK8.0";
        content= Pattern.compile("JDK1\\.4|JDK1\\.5").matcher(content).replaceAll("JDK");
        System.out.println(content);
    }
}

5.2 案例2:实现判断功能:

Java正则表达式学习笔记(二)_第8张图片

String content="13812345678";
      //  if(Pattern.matches("^(138|139)\\d{8}",content)){
        if(content.matches("^1(38|39)\\d{8}")){        //这种方法比较简洁
            System.out.println("YES");
        }else {
            System.out.println("NO");
        }

5.3 案例3:实现分割功能:

Java正则表达式学习笔记(二)_第9张图片

 String content="wo-ai-shang-hai";
        String[] str=content.split("-");
        for(String s:str){
            System.out.print(s+" ");
        }

六:正则表达式练习题

6.1 作业一:

Java正则表达式学习笔记(二)_第10张图片


        String content="[email protected]";
        if(content.matches("(\\w+|_|-)@(\\w+\\.*)[a-zA-Z]+$")){
            System.out.println("YES");
        }else {
            System.out.println("NO");
        }

 6.2 作业二:

Java正则表达式学习笔记(二)_第11张图片

String content=String.valueOf(-12.00);
        if(content.matches("^(-?)\\d+\\.([1-9]+)$")){
            System.out.println("该数字不是整数");
        }else {
            System.out.println("该数字是整数");
        }

 6.3 作业三:

Java正则表达式学习笔记(二)_第12张图片

 String content="http://www.sohu.com:8080/abc/index.htm";
        String regStr="^([a-zA-Z]+)://([a-zA-Z.]+):(\\d+)[\\w-/]*/([\\w.])+$";
        Pattern pattern=Pattern.compile(regStr);
        Matcher matcher=pattern.matcher(content);
        while (matcher.matches()){//整体匹配,如果匹配成功,可以通过group(x),获取对应分组的内容
            System.out.println(matcher.group(0));
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));
            System.out.println(matcher.group(3));
            System.out.println(matcher.group(4));
        }

你可能感兴趣的:(正则表达式,java)