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​用来引用
  • 相关阅读:
    SQL Server 2005的通用分页存储过程
    沉默的羔羊 赵传
    [转]Ubuntu 10.04 安装 codeblocks10.051 过程详细解析
    VMware7.1.5虚拟机安装Ubuntu 11.10使用share folders共享目录
    【转】libmemcached在windows下的PHP扩展(php_memcached.dll下载)
    Ubuntu升级之后The disk drive for / is not ready yet or not present的解决方法
    基于libmemcached,php扩展memcached的安装
    ubuntu configure的问题解决
    Ubuntu安装CodeBlocks相关问题(不能编译或者编译通过但不能生成可执行文件)
    ubuntu笔记
  • 原文地址:https://www.cnblogs.com/rainful/p/14876666.html
Copyright © 2011-2022 走看看