zoukankan      html  css  js  c++  java
  • Java—正则表达式(Pattern类和Matcher类)

    正则表达式介绍

      正则表达式可以用于对字符串的处理,相当于是一个匹配字符串的模板。主要包含查找、替换、分割、提取等操作;Java中通过PatternMatcher类提供对正则的支持。

    字符处理

    特殊字符处理

    对于特殊字符:$^() []{}*+?.|前面都要加上进行转义。

    预定义字符

    预定义字符即为正则表达式中的“通配符”,就是可以匹配多个字符的特殊字符。

    预定义字符 作用
    . 匹配任意字符
    d digit,代表数字,匹配0-9中的所有数字
    D 匹配非数字
    s space,代表空白,匹配所有空白字符(空格、换行、回车、换页、制表符等)
    S 匹配所有非空白字符
    w word,代表单词,匹配所有单词字符,包含0-9所有数字、26个英文字母以及下划线"_"
    W 匹配所有非单词字符

    三种模式的数量表示符

    1. 贪婪模式:Greedy,数量表示符默认为贪婪模式,会一直匹配下去,直到无法匹配为止。
    2. 勉强模式:Reluctant,用问号?后缀表示,只会匹配最少的字符,也被称为最小匹配模式。
    3. 占有模式: Possessive, 用加号+后缀表示。
    贪婪模式 勉强模式 占用模式 作用
    X? X?? X?? X表达式出现0次或1次
    X* X*? X*? X表达式出现0次或多次
    X+ X+? X+? X表达式出现1次或多次
    X{n} X{n}? X{n}? X表达式出现n次
    X{n,} X{n,}? X{n,}? X表达式最少出现n次
    X{n,m} X{n,m}? X{n,m}? X表达式最少出现n次,最多出现m次

    方括号表达式

    方括号表达式含义 作用
    枚举 [abcd],表示a、b、c、d中的任意一个字符;
    范围:- [a-e],表示从a到e字母中的任意字母;可结合枚举进行使用,[a-eu-z],表示从a到e,从u到z范围内的任意字符
    否定:^ [abcd],表示不是a、b、c、d中的字符;[a~e]表示不是a至f范围的字符
    与运算:&& [a-g&&[bch],求a~z和bch的交集,则结果为bc
    并运算 [a-e[h-j]]

    正则表达式的使用

    String类常用方法

    String类中的查找、替换、分割、提取等操作方法

    1. boolean matches(String regex):判断该字符串是否匹配指定的正则表达式;
    2. String replaceFirst(String regex, String replaceStr):将该字符串中第一个匹配regex的子串替换成replaceStr;
    3. String replaceAll(String regex, String replaceStr):将该字符串中所有匹配regex的子串替换成replaceStr;
    4. String[] split(String regex):以regex作为分隔符对字符串进行分割;

    Matcher类常用方法

    1. find():返回目标字符串中是否包含与Pattern匹配的子串,若传入int类型的参数,则从该int索引处向下搜索;
    2. group():返回上一次与Pattern匹配的子串;
    3. start():用于确定子串在目标字符串中的位置;返回上一次与Pattern匹配的子串在目标字符串中的开始位置;
    4. end():用于确定子串在目标字符串中的位置;返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1;
    5. matches():判断整个目标字符串与Pattern是否匹配,要求整个字符串都和Pattern完全匹配时才会返回true;
    6. lookingAt:返回目标字符串前缀与Pattern是否匹配,只需要字符串以Pattern开头就返回true;
    7. reset():将现有的Matcher对象应用于一个新的字符序列;

    Pattern对象用法

      Pattern是不可变类,是正则表达式编译后在内存中的表示形式,在Java中使用正则表达式字符串必须要先被编译为Patter对象,然后再使用Pattern对象创建对应的Matcher对象。
    用法

    // 编译正则表达式为Pattern对象
    Pattern pattern = Pattern.compile("bc*d");
    // 使用编译好的Pattern对象创建Matcher对象
    Matcher m = p.matcher("bccccd");
    boolean b = m.matches();
    System.out.println(b);
    

    结果

    true
    

    上述步骤等价于

    boolean b = Pattern.matches("bc*d", "bccccd");
    System.out.println(b);
    

    封装正则表达式工具类

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class PatternUtil {
        public static Matcher getMatcher(String regex, String source) {
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(source);
            return matcher;
        }
    
        public static void main(String[] args) {
            String regix = "(\D*)(\d+)(.*)(\d)";
            String str = "this is test 1000 $, please check! 12";
            Matcher matcher = getMatcher(regix, str);
            if (matcher.find()) {
                System.out.println("matcher group():" + matcher.group());
                System.out.println("matcher group(0): " + matcher.group(0));
                System.out.println("matcher group(1):" + matcher.group(1));
                System.out.println("matcher group(2):" + matcher.group(2));
                System.out.println("matcher group(3):" + matcher.group(3));
                System.out.println("matcher group(4):" + matcher.group(4));
            } else {
                System.out.println("no match");
            }
        }
    }
    
    

    运行结果

    matcher group():this is test 1000 $, please check! 12
    matcher group(0): this is test 1000 $, please check! 12
    matcher group(1):this is test 
    matcher group(2):1000
    matcher group(3): $, please check! 1
    matcher group(4):2
    
  • 相关阅读:
    数论分块与整除相
    P3254——DP&&入门
    P3384——树链剖分&&模板
    树链剖分模板
    P4145——线段树点修改&&模板题
    P1198最大数——线段树点修改&&模板题
    线段树(四)——两个标记(add和set)
    epoll 知识总结
    C++中的mutable关键字
    [LeetCode] Max Points on a Line
  • 原文地址:https://www.cnblogs.com/Andya/p/12500399.html
Copyright © 2011-2022 走看看