首页 > 代码库 > java正则表达式基础知识(转)

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
@Testpublic 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空白字符 [ \t\n\x0B\f\r]
\S非空字符
\w常规字符 [a-zA-Z_0-9]
\W非常规字符
@Testpublic void testPredef() {    //匹配 任意字符 (可能不匹配行终止符)    assertTrue("d".matches("."));    //匹配 数字    assertTrue("4".matches("\\d"));    //匹配 非数字    assertTrue("d".matches("\\D"));    //匹配 空白字符 [ \t\n\x0B\f\r]    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次
@Testpublic 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 分组

@Testpublic 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单词边界
\B非单词边界
\A输入开始
\z输入结尾
@Testpublic 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());        }    }}

 

输出

Dog47

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

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