• java正则表达式基础知识(转)


    1基础

    2.1 简单字符类

    构造描述
    [abc] a,b或c
    [^abc] 除a,b或c外的字符
    [a-zA-Z] a至z 或 A至Z
    [a-d[m-p]] a至d 或 m至p
    [a-z&&[def]] d,e或f
    @Test
    public void testChar() {
        //匹配 b,c或d
        assertTrue("d".matches("[bcd]"));
        //匹配除 a,b,c 以外的字符 (否定)
        assertTrue("d".matches("[^abc]"));
        //匹配 a至z 的任一字符 (范围)
        assertTrue("d".matches("[a-z]"));
        //匹配 d,e或f (交集)
        assertTrue("d".matches("[a-z&&[def]]"));
    }

    2.2 预定义字符类

    构造描述
    . 任意字符
    d 一个数字 [0-9]
    D 一个非数字 [^0-9]
    s 空白字符 [ x0Bf ]
    S 非空字符
    w 常规字符 [a-zA-Z_0-9]
    W 非常规字符
    @Test
    public void testPredef() {
        //匹配 任意字符 (可能不匹配行终止符)
        assertTrue("d".matches("."));
        //匹配 数字
        assertTrue("4".matches("\d"));
        //匹配 非数字
        assertTrue("d".matches("\D"));
        //匹配 空白字符 [ 	
    x0Bf
    ]
        assertTrue(" ".matches("\s"));
        //匹配 非空字符
        assertTrue("d".matches("\S"));
        //匹配 常规字符 [a-zA-Z_0-9]
        assertTrue("d".matches("\w"));
        //匹配 非常规字符
        assertTrue("!".matches("\W"));
    }

    2.3 量词

    贪心勉强描述
    X? X?? X出现一次或没有
    X* X*? X出现零次或多次
    X+ X+? X出现一次或多次
    X{n} X{n}? X出现n次
    X{n,} X{n,}? X出现至少n次
    X{n,m} X{n,m}? X出现至少n次,至多m次
    @Test
    public void testQuant() {
        // * 表示出现0次或多次 (贪心,最大匹配)
        assertEquals("<b>d<b>".replaceAll("<.*>","#"),"#");
        // * 表示出现0次或多次,? 表示最小匹配
        assertEquals("<b>d<b>".replaceAll("<.*?>","#"),"#d#");
        // + 表示出现1次或多次 (贪心,最大匹配)
        assertEquals("<b>d<b>".replaceAll("<.+>","#"),"#");
        // * 表示出现1次或多次,? 表示最小匹配
        assertEquals("<b>d<b>".replaceAll("<.+?>","#"),"#d#");
        // {1} 表示出现1次
        assertEquals("<b>d<b>".replaceAll("<.{1}>","#"),"#d#");
        // {1,} 表示出现1次至多次
        assertEquals("<b>d<b>".replaceAll("<.{1,}>","#"),"#");
        // {1,8} 表示出现1次至8次
        assertEquals("<b>d<b>".replaceAll("<.{1,8}>","#"),"#");
    }

    2.4 分组

    @Test
    public void testGroup() {
        // () 表示分组,?表示出现0次或1次,\d\d表示两个数字
        assertFalse("du2".matches("du(\d\d)?"));
        // 匹配
        assertTrue("du12".matches("du(\d\d)?"));
        // 不匹配,分组条件出现了2次
        assertFalse("du1212".matches("du(\d\d)?"));
        // 匹配
        assertTrue("du1212".matches("du(\d\d)+"));
    }

    2.5 边界匹配

    边界构造描述
    ^ 行开始
    $ 行结尾
     单词边界
    B 非单词边界
    A 输入开始
    z 输入结尾
    @Test
    public void testBound() {
        // ^ 行开始
        assertTrue("42du".matches("^(\d\d)du"));
        // $ 行结尾
        assertTrue("42du".matches("\d\d(du)$"));
        // \b 表示单词边界
        assertTrue("a dog".matches(".*\bdog\b"));
        // \B 表示非单词边界
        assertTrue("a doggie".matches(".*\bdog\B.*"));
    }

    2.6 Pattern和Matcher基本

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class MatcherDemo {
        public static void main(String[] args){
            // 不区分大小写
            Pattern pattern = Pattern.compile("\bdog\B",Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher("The Doggie plays");
            while (matcher.find()) {
                System.out.println(matcher.group());
                System.out.println(matcher.start());
                System.out.println(matcher.end());
            }
        }
    }

    输出

    Dog
    4
    7

    3 示例

    3.1 用户名正则

    /*
    *  ^            开头
    *   [a-z0-9_-]  匹配a-z,0-9,下划线,中线
    *    {4,10}     长度4至10
    *  $            结尾
    */
    String unReg = "^[a-z0-9_-]{4,10}$";

    3.2 颜色正则

    /*
    *    ^    开头
    *     #         "#" 符号
    *    (         开始分组
    *      [A-Fa-f0-9]{6} 长度为6的字母数字
    *      |              或
    *      [A-Fa-f0-9]{3} 长度为3的字母数字
    *    )         分组结束
    *    $    结尾
    */
    String coReg = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";

    3.3 24时制时间

    /*
     *  (    分组开始
     *    [01]?[0-9]    0-9,00-09,10-19
     *    |                或
     *    2[0-3]        20-23
     *  )    分组结束
     *  :     :符号
     *  [0-5][0-9]    00 至 59
     */
    String tiReg = "([01]?[0-9]|2[0-3]):[0-5][0-9]";

    4 结语

    本文简要介绍了java正则表达式的最基础的知识内容,并给出了简单实用的小例子来理解消化所学内容。要想熟练掌握这些基础知识,还要动手多加以练习,阅读官方文档。java正则表达式的进阶的内容我会在下一篇文章里进行介绍。
    推荐java正则表达式学习的一些资料:

    官方:docs.oracle.com

    英文:vogella.com

    中文:runoob.com

  • 相关阅读:
    Html5新标签解释及用法
    时间线效果
    NHibernate数据访问层核心代码
    C#开源资源项目
    安卓开发环境搭建之最新版(So Easy!)
    WIN8相关资源汇总
    HTML5 Shiv – 让该死的IE系列支持HTML5吧
    WCF 提高传输数据性能方法之二 (数据分割)
    支付宝集成问题(.net篇)
    WCF 提高传输数据性能方法之一 (使用压缩)
  • 原文地址:https://www.cnblogs.com/acuier/p/6851756.html
Copyright © 2020-2023  润新知