zoukankan      html  css  js  c++  java
  • 正则表达式

    正则表达式

    • 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]{6}
    • 排除指定范围 [^…]
    • 或规则 |
      • 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​用来引用
  • 相关阅读:
    学习redis-安装和基本一些命令
    Eclipse启动报错Java was started but returned exit code=13
    踩过的坑系列之InputStream.read(byte[])方法
    <<深入Java虚拟机>>-虚拟机类加载机制-学习笔记
    <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记
    <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
    创建线程的两种方式比较Thread VS Runnable
    Java设计模式之--代理模式学习
    shell脚本中$参数的介绍
    (转)使用DataTime这个类来获取当前的时间
  • 原文地址:https://www.cnblogs.com/rainful/p/14876666.html
Copyright © 2011-2022 走看看