regular expression:正则表达式,简写为RegExp,擅长用在文本格式匹配领域
1、正则表达式的元字符
1、转义字符"\"
在java中,用\\来表示转义字符,需要用到转义字符的符号有如下几个:==.*+()$/?[]^{}==但当这些符号在[]时,不需要转义。
2、字符匹配符
符号 | 含义 | 示例 | 解释 | 匹配输入 |
---|---|---|---|---|
[] | 可以接收的字符列表 | [abcde] | a、b、c、d、e中的任意一个字符 | |
[^] | 不接收的字符列表 | [^abcde] | 除a、b、c、d、e外的任意一个字符,包含特殊字符 | |
- | 连字符 | A-Z | 从A到Z之间的任意一个大写字母 | |
. | 匹配除\n以外的所有字符 | a..b | 以a开头,b结尾,中间包括两个任意字符的总长我4的字符串 | |
\\d | 匹配单个数字字符,相当于[0-9] | \\d{3}(\\d)? | 包括3个或4个数字的字符串 | 123、5678 |
\\D | 匹配单个非数字字符,相当于[^0-9] | \\D(\\d)* | 以当个非数字字符开头,后接任意个数字字符串 | a、A123 |
\\w | 匹配单个数字、大小写字符、,相当于[0-9a-zA-Z] | \\d{3}\\w{4} | 以3个数字开头,后接数字或字母的长度为7的字符串 | 2351234、321hoh2 |
\\W | 匹配单个非数字、大小写字母字符、,相当于[^0-9a-zA-Z] | \W+\d{2} | 以至少一个非数字、大小写字母字符开头,以两个数字字符结尾的字符串 | *23、#33@?10 |
(?i) | 其后锁接的字符串不区分大小写 | (?i)abc | 以abc为顺序的不区分大小写的字符串 | AbC、abC、ABC、abc |
(?i) | 其后锁接的字符串不区分大小写 | a((?i)b)c | 以a开头,以c结尾,中间的b不区分大小写的字符串 | 只有两个,abc、aBc |
\\s | 任何空白字符(空格、制表符等) | |||
\\S | 除去任何空白字符(空格、制表符等),与\\s相反 |
说明:例如“abc”这种不带有表达式的匹配为全匹配,默认情况下,匹配是区分大小写的,解决不区分大小写的问题,除了用表达式实现之外,我们还可以在创建Pattern对象时指定,例如:Patternpattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE*/);
3、选择匹配符
符号 | 含义 | 示例 | 解释 | 匹配输入 |
---|---|---|---|---|
| | |两侧的表达式存在或的关系 | ab|bc | 要么匹配ab,要么匹配bc |
4、限定符
用于指定其前面的字符或组合项连续出现多少次
符号 | 含义 | 示例 | 解释 | 匹配输入 |
---|---|---|---|---|
* | 指定前面的字符重复0次或n次 | (abc)* | 包含连续任意个abc字符串 | abcabc、abc |
+ | 指定前面字符串重复1次或n次(至少1次) | m+(abc)* | m出现至少一次,abc可以重复任意次 | m、mabc、mabcabc、mmabcabc |
? | 指定前面的字符出现0次或1次 | m+abc? | 至少以1个m开头,后面接ab或abc的字符串 | mab、mabc、mmmmab、mmabc |
{n} | 只能输入n个字符 | [abcd]{3} | 由a、b、c、d中任意组成的3个长度字符串 | aaa、acd、bbd |
{n,} | 指定至少n个匹配 | [abcd]{3,} | 包含由a、b、c、d组成的,长度至少为3的字符串 | abc、abdc、aabbccdd |
{n,m} | 指定前面的组合至少出现n次,但不多余m次 | [abc]{2,3} | a、b、c三个字符中任意组合成至少2个长度,最多3个长度的字符串 | aa、aaa、abc、cb |
注意,java的匹配是贪婪匹配,当有符合最长的匹配时,会优先匹配最长的,如果要使用非贪婪匹配,在限定符的后面加上?,即可让匹配规则变为非贪婪匹配。例如:a+?来匹配字符串aaaahoih1234hioh,会返回4个a,而不是1个aaaa。
5、定位符
符号 | 含义 | 示例 | 解释 | 匹配输入 |
---|---|---|---|---|
^ | 指定起始字符 | ^[0-9]+[a-z]* | 以至少一个数字开头,后接任意个小写字母的字符串 | 1、12345、1aaaa |
$ | 指定结束字符 | ^[0-9]\\-[a-z]+$ | 以一个数字开头,加上-,再以一个或多个小写字母结尾的字符串 | 1-a、2-abcd |
\\b | 匹配目标字符串的边界 | abc\\b | 这里说的字符串的边界是指子串间有空格,或者是目标字符串的结束位置 | abcnnabc hoghaoabc |
\\B | 匹配目标字符串的非边界 | abc\\B | 这里说的字符串的边界是指子串间有空格,或者是目标字符串的结束位置 | abcnnabc hoghaoabc |
2、分组
捕获分组
常用分组构造形式 | 说明 |
---|---|
(pattern) | 非命名捕获。捕获匹配的字符串,编号为0的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号 |
(?pattern) | 命名捕获。将匹配的字符串捕获到一个组名称或者编号名称中,用于name的字符串不能包含任何标点符号,并且不能以数字开头,可以使用单引号替代尖括号,例如(?'name’pattern) |
说明:使用了命名分组,可以使用编号来捕获组,也可以用name来捕获组
非捕获分组
3、常用正则表达式
要求 | 规则 | 表达式 |
---|---|---|
汉字字符串 | 用16制编码范围来表示 | ^[\u0391-\uffe5]+$ |
邮政编码 | 以1-9开头的六位数字 | ^[1-9]\\d{5}$ |
QQ号 | 以1-9开头的5-10位数字 | ^[1-9]\\d{4,9}$ |
URL | "^((http | |
电子邮箱 | 只能有一个@,以a-zA-Z0-9-_开头,以com、cn等结尾 | ^[\\w-]+@([a-zA-Z]\.)+[a-zA-Z]+$ |
一、校验数字的表达式
1 数字:1$
2 n位的数字:^\d{n}$
3 至少n位的数字:^\d{n,}$
4 m-n位的数字:^\d{m,n}$
5 零和非零开头的数字:^(0|[1-9][0-9])$
6 非零开头的最多带两位小数的数字:^([1-9][0-9])+(.[0-9]{1,2})?$
7 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$
8 正数、负数、和小数:^(-|+)?\d+(.\d+)?$
9 有两位小数的正实数:2+(.[0-9]{2})?$
10 有1~3位小数的正实数:3+(.[0-9]{1,3})?$
11 非零的正整数:4\d$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$
12 非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
13 非负整数:^\d+$ 或 5\d*|0$
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(.\d+)?$ 或 6\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
16 非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
17 正浮点数:7\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]))$
18 负浮点数:^-([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])))$
19 浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$
二、校验字符的表达式
1 汉字:8{0,}$
2 英文和数字:9+$ 或 10{4,40}$
3 长度为3-20的所有字符:^.{3,20}$
4 由26个英文字母组成的字符串:11+$
5 由26个大写英文字母组成的字符串:12+$
6 由26个小写英文字母组成的字符串:13+$
7 由数字和26个英文字母组成的字符串:14+$
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:15+$
10 中文、英文、数字但不包括下划线等符号:16+$ 或 17{2,20}$
11 可以输入含有^%&’,;=?KaTeX parse error: Can't use function '\"' in math mode at position 1: \̲"̲等字符:[^%&',;=?\x22]+
12 禁止输入含有的字符:[^\x22]+
三、特殊需求表达式
1 Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 InternetURL:[a-zA-z]+://[^\s] 或 ^https://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$
4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5 电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7 身份证号:
15或18位身份证:^\d{15}|\d{18}$
15位身份证:18\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
18位身份证:19\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):20[a-zA-Z0-9_]{4,15}$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):21\w{5,17}$
11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.[A-Z]).{8,10}$
12 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
15 钱的输入格式:
16 1.有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:22[0-9]$
17 2.这表示任意一个不以0开头的数字,但是,这也