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

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

目录

一:正则表达式应用实例

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

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

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

六:正则表达式练习题


一:正则表达式应用实例

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:(重点)

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

2.2 Matcher类:

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

Matcher类的方法及说明:

2.3 PatternSyntaxException类:

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

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

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

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 经典的结巴程序:

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)使用反向引用来替换匹配到的内容

        //注意:因为正则表达式变化,所以需要重置matcher
        pattern=Pattern.compile("(.)\1+");
        matcher=pattern.matcher(content);
        while (matcher.find()){
            System.out.println("找到="+matcher.group(0));
        }
        //使用反向引用来替换匹配到的内容
        content=matcher.replaceAll("");
        System.out.println("content: "+content);

         */
        //使用一条语句,去掉重复的字,我我要学学学学编程java
        content=Pattern.compile("(.)\1+").matcher(content).replaceAll("");
        System.out.println(content);
    }
}
五:String类中使用正则表达式

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

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:实现判断功能:

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:实现分割功能:

 String content="wo-ai-shang-hai";
        String[] str=content.split("-");
        for(String s:str){
            System.out.print(s+" ");
        }
六:正则表达式练习题

6.1 作业一:


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

 6.2 作业二:

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

 6.3 作业三:

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/740572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存