正则表达式
一、常见匹配规则:
(匹配单个)
- \\:匹配“\”
- \n:匹配换行
- \t:匹配制表符
- [abc]:表示可能是a、b、c中的任意一个
- [^abc]:表示不是a、b、c中的任意一个
- [a-zA-Z]:表示任一字母,不区分大小写
- [0-9]:表示任一数字
(简化匹配)
- .:任意一个字符,.*匹配除 \n 以外的任何字符。
- \d:等价于[0-9]
- \D:等价于[^0-9]
- \s:任意空格,可能是空格、换行、制表符
- \S:任意的非空格数据
- \w:字母、数字、下划线,等价于[a-zA-Z_0-9]
- \W:与\w相反,等价于[^a-zA-Z_0-9]
(边界匹配)
- ^:边界开始
- $:边界结束
(数量匹配)
- 表达式?:0次或1次
- 表达式*:0次、1次或多次
- 表达式+:1次或多次
- 表达式{n}:表达式长度为n
- 表达式{n,}:表达式长度为n以上
- 表达式{n,m}:表达式长度为n~m次
(逻辑匹配)
- XY:表达式X后紧跟表达式Y
- X|Y:有一个表达式满足即可
- (表达式):表明是一个整体,可以作为数量的设置单位
二、常见正则表达式
一、校验数字的表达式
【数字】^[0-9]*$
【n位的数字】^\d{n}$
【至少n位的数字】^\d{n,}$
【m-n位的数字】^\d{m,n}$
【零和非零开头的数字】^(0|[1-9][0-9]*)$
【非零开头的最多带两位小数的数字】^([1-9][0-9]*)+(.[0-9]{1,2})?$
【带1-2位小数的正数或负数】^(\-)?\d+(\.\d{1,2})?$
【有两位小数的正实数】^[0-9]+(.[0-9]{2})?$
【有1~3位小数的正实数】^[0-9]+(.[0-9]{1,3})?$
【非零的正整数】^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
【非零的负整数】^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
【非负整数】^\d+$ 或 ^[1-9]\d*|0$
【非正整数】^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
【非负浮点数】^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
【非正浮点数】^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
【正浮点数】^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
【负浮点数】^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
【浮点数】^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
二、校验字符的表达式
【汉字】^[\u4e00-\u9fa5]{0,}$
【英文和数字】^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
【长度为3-20的所有字符】^.{3,20}$
【由26个英文字母组成的字符串】^[A-Za-z]+$
【由26个大写英文字母组成的字符串】^[A-Z]+$
【由26个小写英文字母组成的字符串】^[a-z]+$
【由数字和26个英文字母组成的字符串】^[A-Za-z0-9]+$
【由数字、26个英文字母或者下划线组成的字符串】^\w+$ 或 ^\w{3,20}$
【中文、英文、数字包括下划线】^[\u4E00-\u9FA5A-Za-z0-9_]+$
【中文、英文、数字但不包括下划线等符号】^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
【可以输入含有^%&',;=?$\"等字符】[^%&',;=?$\x22]+ 12
【禁止输入含有~的字符】[^~\x22]+
【/[\uFF00-\uFFFF]/】 全角符号
【/[\u0000-\u00FF]/】半角符号
三、特殊需求表达式
【Email地址】^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
【域名】[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
【InternetURL】[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
【手机号码】^1[3456789]\d{9}$
【电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)】^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$
【国内电话号码(0511-4405222、021-87888822)】\d{3}-\d{8}|\d{4}-\d{7}
【身份证号(15位、18位数字)】^\d{15}|\d{18}$
【短身份证号码(数字、字母x结尾)】^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
【日期格式】^\d{4}-\d{1,2}-\d{1,2}
【一年的12个月(01~09和1~12)】^(0?[1-9]|1[0-2])$
【一个月的31天(01~09和1~31)】^((0?[1-9])|((1|2)[0-9])|30|31)$
【腾讯QQ号】[1-9][0-9]{4,} (腾讯QQ号从10000开始)
【中国邮政编码】/^[0-9]{6}$/ (中国邮政编码为6位数字)
三、String类对正则的支持
- matches()
- replaceAll()
- split()
(字符串替换)-->把非字母或数字的字符去掉
String str = "sadas@#@dads5_&&azxc14&*&&dfsdf";
String regex = "[^a-zA-Z0-9]+";
System.out.println(str.replaceAll(regex, ""));
sadadads5azxc14dfsdf
(字符串拆分)
String str = "aa4wf6wfe66serwed46sd46";
String regex = "\\d+";
String result [] = str.split(regex);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + "、 ");
}
aa、 wf、 wfe、 serwed、 sd、
String类可以完成很多的正则操作,最起码在处理拆分、匹配、替换时,String更加方面,除非是很复杂的正则才会用到java.util.regex包中的类。
四、正则表达式匹配模式[贪婪型、勉强型、占有型]
4.1 Greediness(贪婪型):最大匹配
X?、X*、X+、X{n,} 是最大匹配。例如你要用 “<.+>” 去匹配 “a<tr>aava </tr>abb”,也许你所期待的结果是想匹配 “<tr>”,但是实际结果却会匹配到 “<tr>aava </tr>。
在 Greediness 的模式下,会尽量大范围的匹配,直到匹配了整个内容,这时发现匹配不能成功时,开始回退缩小匹配范围,直到匹配成功
String test = "a<tr>aava </tr>abb ";
String reg = "<.+>";
System.out.println(test.replaceAll(reg, "###"));
输出:a###abb
4.2 Reluctant(Laziness)(勉强型):最小匹配
X??、X*?、X+?、X{n,}? 是最小匹配,其实X{n,m}?和X{n }?有些多余。在 Greediness 模式之后添加 ? 就成最小匹配。
在 Reluctant 的模式下,只要匹配成功,就不再继续尝试匹配更大范围的内容
String test = "a<tr>aava </tr>abb ";
String reg = "<.+?>";
System.out.println(test.replaceAll(reg, "###"));
输出:a###aava ###abb
与 Greediness 不同,Reluctant 模式下匹配了两次内容
4.3 Possessive(占有型):完全匹配
X?+、X*+、X++、X{n,}+ 是完全匹配,在 Greediness 模式之后添加 + 就成完全匹配。
Possessive 模式与 Greediness 有一定的相似性,那就是都尽量匹配最大范围的内容,直到内容结束,但与 Greediness 不同的是,完全匹配不再回退尝试匹配更小的范围。
String s = "a<tr>aava </tr>abb ";
// (占有型):完全匹配,只有一模一样才能匹配上
String reg = "<.++>";
String reg1 = "<tr>aava </tr>";
System.out.println(s.replaceAll(reg, "###"));
System.out.println(s.replaceAll(reg1, "###"));
输出:a<tr>aava </tr>abb
###