正则表达式

正则表达式

  • java 标准库 java.util.regex 提供支持

匹配规则

  • 任意字符 .
  • 任意数字 \d
  • 非数字 \D
  • 常用字符(一个字母、数字或下划线) \w
  • \W反着来
  • 空格字符(空格、tab) \s
  • \S反着来
  • 重复匹配
    • 任意个 *
    • 至少一个 +
    • 一个或者0个 ?
    • 精确n个 {n}
    • m~n个 {m, n}
String re = "java\\d*"
"java08".matches(re);

复杂匹配规则

  • 匹配开头和结尾 ^ $
  • 匹配指定范围 […] (列举)
    • [1-9]{6,7}匹配1-9的数字6-7个
    • [0-9a-fA-F]匹配0-9字符,a-f字符,A-F字符
      • 匹配6个十六进制数 [0-9a-fA-F]
  • 排除指定范围 [^…]
  • 或规则 |
    • AB|CD|go 匹配AB或CD或go
  • 括号 learn\\s(java|php|go)

分组匹配

  • 分组匹配 (…)

    • 就是把一小部分的匹配结果分组,例如电话

      • (\d{3,4})\-(\d{6,8}) 前面为区号,后面为号码
    • 步骤

      • 引入regex包,用pattern对象匹配,匹配成功后返回Matcher对象,如果匹配成功,可以直接从Matcher.group(index)返回子串

        Pattern p = Pattern.compile("\\d{3,4}\\-(\\d{7,8}");
        Matcher m = p.matcher("010-12345678");
        if (m.matches()){
            String g1 = m.group(1);
            String g2 = m.group(2);
        } else {
            System.out.println("匹配失败");
        }
        
        • 注意这里第一个索引是1
  • Pattern

    • String.matches() 方法需要每次都编译一次pattern,所以可以创建一个Pattern对象,反复使用

      class PatternDemo{
          public static void main(String[] args) {
              // 利用分组匹配,从字符串"23:01:59"提取时、分、秒。
              Pattern pattern = Pattern.compile("([0-2]\\d):([0-5]\\d):([0-5]\\d)");
              Matcher matcher = pattern.matcher("23:01:59");
              if (matcher.matches()){
                  System.out.println(matcher.group(1));
                  System.out.println(matcher.group(2));
                  System.out.println(matcher.group(3));
              }
          }
      }
      

非贪婪匹配

  • 匹配规则后面加个 ? 就可以使匹配规则更少的匹配

  • 注意 \d?? 两个问号的区别

搜索和替换

  • 分割字符串

    "a b c".split("\\s"); // ==> {"a","b","c"}
    "a b  c".split("\\s"); // ==> {"a","b","","c"}
    "a b  c".split("\\s+");
    
  • 搜索字符串

    Pattern pattern = Pattern.compile("\\wo\\w");
    Matcher m = pattern.matcher(str);
    // 这里没有分组,所以必须调用find()方法
    while (m.find()){
        System.out.println(str.substring(m.start(), m.end()));
    }
    
  • 替换字符串

    • String.replaceAll() 这个在核心类字符串有写
  • 反向引用

    • 如果要在匹配到的字符串前后加东西,replaceAll的第二个参数可以使用 <b>$1</b>,这种方式, $1$2​用来引用
posted @ 2021-06-11 22:11  Rainful  阅读(44)  评论(0编辑  收藏  举报