正则表达式是一个用字符串描述一个匹配规则的字符串,使用正则表达式可以快速判断给定的字符串是否符合匹配规则,Java内建正则表达式引擎java.util.regex
1.匹配规则
1)从左到右按规则匹配。
例1:精确匹配:“abc” ,则只能“abc”匹配,"ab"/"Abc"/"abcd"都不可以。
例2:精确匹配:"a\&c"(特殊字符需要转义),则只能"a&c"匹配,"ab"/"abc"/"a&cd"都不可以。
例3:精确匹配:"a\u548cc",非ASCII字符用\U####表视,则能"a和c"匹配,"a与c"/"a&c"/"abc"都不可以。
例4:特殊符号“.” 可以匹配任意字符:“a.c”,则能"abc"/"a&c"匹配,"ac"/"accc"都不可以。
例5:符号\d可以匹配一个数字:"00\d",则能"007"/“008”匹配,"00A"/"0077"都不可以。
例6:符号\w可以匹配一个字母/数字或者下划线:"java\w",则能"javac"/"java8"/"java_"匹配,"java#"/"java "都不可以。
例7:符号\s可以匹配一个空白字符:"A\sB",则能"A B"/"A B"(Tab键也算一个空白字符)匹配,"AB"/"A B"(两个空格)都不可以。
例8:符号\D可以匹配一个非数字:"00\D",则能"00A"/"00#","001"/"007"都不可以。
例9:符号\W可以匹配一个非字母/数字或者下划线:"java\W",则能"java!"/"java "匹配,"javac"/"java_"都不可以。
例10:符号\S可以匹配一个非空白字符:"A\SB",则能"A&B"/"ABB"匹配,"A B"/"A B"都不可以。
例11:修饰符*可以匹配任意个字符:"A\d*"(*是用来修饰\d的),则能"A"/"A1"/"A007"匹配,"AB"不可以。
例12:修饰符+可以匹配任意个字符:"A\d+"(+是用来修饰\d的),则能"A1"/"A007"匹配,"A"/"AB"都不可以。
例13:修饰符?可以匹配零个或一个字符:"A\d?",则能"A"/"A1"匹配,"A12"/"AB"都不可以。
例14:修饰符{n}可以匹配n个字符:"\d{6}",则能"123456"/"999999"匹配,"12345"/"1234567"/"12345A"都不可以。
例15:修饰符{n,m}可以匹配n-m个字符:"\d{3,5}",则能"123"/"12345"匹配,"12"/"123456"/"123A5"都不可以。
例16:修饰符{n,}可以匹配至少n个字符:"\d{3,}",则能"123"/"1234"/"123456789"匹配,"12"/"12A"都不可以。
2.复杂匹配规则
1)
例1:^和$匹配开头和结尾:"^A\d{3}$",则能"A001"/"A999"匹配,"B001"/"A0001"都不可以。Java的正则表达式默认只能做单行匹配,所以"^"和"$"可以加也可以不加。
例2:[...]可以匹配范围内的字符:"[abc]1",则能"a1"/"b1"/"c1"匹配,"ab1"/"x1"都不可以。
例3:[...]可以匹配一个范围内的字符:"[a-f]1",则能"a1"/"b1"/"f1"匹配,"q1"/"ab1"都不可以。
例4:[...]可以匹配范围内的字符:"[a-f0-9]{6}",则能"1a2b3c"/"ffffff"/"ff0102"匹配,"abc12"/"A0000F"都不可以。
例5:[...]可以匹配范围内的字符:"[a-f0-9_]{6}",则能"1a_b3c"/"_fffff"/"ff010_"匹配,"abc1-f"/"A000_F"都不可以。
例6:[^...]可以匹配非范围内的字符:"[^0-9]{6}",则能"abcdef"/"$$$$$$"/"A-B-C-"匹配,"1abcde"/"A000F"都不可以。
例7:AB|CD可以匹配AB或CD:"java|php",则能"java"/"php"匹配,"c++"/"jphp"都不可以。
例8:(AB|CD)可以匹配AB或CD:"learn\s(java|php)",则能"learn java"/"learn php"匹配,"learn c++"/"learn python"都不可以。
3.分组匹配规则
例1:(...)可以分组:"(\d{4})\-(\d{1,2})\-(\d{1,2})",则可以匹配"2016-12-12"。
例2:提取电话号码###-#######,^(\d{3,4})\-(\d{6,8})$
4.非贪婪匹配
例:给定一个字符串表示的数字:
判断该数字末尾0的个数,"123000":3个0,"10100":2个0,"1001":0个0。 我们可以使用^(\d+)(0*)$进行匹配。
匹配的结果和我们所设想的不一样,但是是正确的,这是因为正则表达式默认的是使用的贪婪匹配:尽可能多的向后匹配。
可以使用"?"实现非贪婪匹配,即"^(\\d+?)(0*)$"。
5.使用正则表达式搜索和替换:
1)使用正则表达式分割字符串(String.split())
2)使用正则表达式搜索字符串(Matcher.find())
3)使用正则表达式替换(String.replaceAll())