正则专题

2021-06-10  本文已影响0人  攻城老狮

1 正则表达式的基本语法

元字符的功能:限定符;选择匹配符;分组组合和反向引用符;特殊字符;字符匹配符;定位符

1.1 转义符

说明:转义符(\\)用于在正则表达式中检索某些特殊字符。例如:匹配 . * + ( ) $ / \ ? [ ] ^ { } 等在正则表达式中有具体含义的字符。

public class Test01 {
    public static void main(String[] args) {
        String content = "abc$(a.bc(123( )";
        //转义了. 使其单纯匹配.本身,没有其他含义
        String regStr = "\\.";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}

1.2 字符匹配符

说明:匹配指定的字符


image-20210604083139495.png image-20210604083151568.png

1.3 选择匹配符

说明:在匹配某个字符串的时候具有选择性的

image-20210604083408567.png

1.4 限定符

说明:用于指定其前面的字符和组合项连续出现多少次

image-20210604083747388.png image-20210604083800078.png

1.5 定位符

说明:规定要匹配的字符串出现的位置

image-20210604084206567.png

1.6 分组

image-20210604084528221.png image-20210604084541063.png

1.7 分组、捕获和反向引用

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

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

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

//匹配两个连续的相同数字:(\\d)\\1
//匹配五个连续的相同数字:(\\d)\\1{4}
//匹配个位和千位相同,十位和百位相同的数 5225,1551:(\\d)(\\d)\\2\\1
//把类似 : "我我要学学学学编程 java!",通过正则表达式修改成 "我要学编程java"
public class Test01 {
    public static void main(String[] args) {
        String content = "我我要学学学学编程 java!";
        String newContent = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
        System.out.println(newContent);
    }
}

2 正则表达式的常用类

2.1 Pattern类

Pattern对象是正则表达式对象。Pattern类没有公共构造方法,要创建一个Pattern对象,需要调用其公共静态方法,它返回一个Pattern对象。该方法接受一个正则表达式作为第一个参数。

Pattern pattern = Pattern.compile(regStr);
//matches() 方法,用于整体匹配, 在验证输入的字符串是否满足条件使用
public class Test01 {
    public static void main(String[] args) {
        String content = "abc$(a.bc(123( )";
        //该正则可以匹配全部content的字符串,故为true
        String regStr = "^abc.*";
        boolean matches = Pattern.matches(regStr, content);
        System.out.println(matches);
    }
}

2.2 Matcher类

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

public class Test01 {
    public static void main(String[] args) {
        String content = "abc$(a.bc(123( )";
        String regStr = "bc";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            //1.start和end方法获取匹配字符串在源字符串的开始和结尾的索引
            System.out.println("start: " + matcher.start() + ",end: " + matcher.end());
            System.out.println(content.substring(matcher.start(), matcher.end()));
        }

        //2.替换匹配的字符串为指定的字符串
        String newContent = matcher.replaceAll("hello");
        System.out.println(newContent);

        regStr = "^abc.*";
        pattern = Pattern.compile(regStr);
        matcher = pattern.matcher(content);
        //3.整体匹配方法,常用于校验某个字符串是否满足某个规则
        boolean matches = matcher.matches();
        System.out.println(matches);
    }
}

3 String类中使用正则表达式

public class Test01 {
    public static void main(String[] args) {
        String content = "Hello1.3,aaaaa&Hello1.4";
        //1.替换功能
        String newContent = content.replaceAll("Hello1.3|Hello1.4", "nihao");
        System.out.println(newContent);
        //2.判断功能
        boolean matches = content.matches("^Hello.*$");
        System.out.println(matches);
        //3.分割功能
        String[] split = content.split(",|&");
        for (String s : split) {
            System.out.println(s);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读