预搜索(零宽断言)
- 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的。
- 这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。是对位置的匹配。
- 正则表达式匹配过程中,如果子表达式匹配到的字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的。
表达式 | 含义 |
---|
(?=exp) | 断言自身出现的位置的后面能匹配表达式exp |
(?<&#61;exp) | 断言自身出现的位置的前面能匹配表达式exp |
(?!exp) | 断言此位置的后面不能匹配表达式exp |
(? | 断言此位置的前面不能匹配表达式exp |
举个例子&#xff1a;
现在有以下文本&#xff0c;我们需要找到1998年出生的人:
1999李大龙
1998李如花
1997李孝利
1998李雪花
(?<&#61;exp)
用这个表达式(?<&#61;1998)[\u4e00-\u9fa5]{3}
找到1998年出生的人。
(?
用这个表达式(?找到不是1998年出生的人。
而如果 文本是这个样子&#xff1a;
李大龙1999
李如花1998
李孝利1997
李雪花1998
(?&#61;exp)
可以用这个表达式[\u4e00-\u9fa5]{3}(?&#61;1998)
找到1998年出生的人。
(?!exp)
可以用这个表达式[\u4e00-\u9fa5]{3}(?!1998)
找到不是1998年出生的人。
运算符优先级
正则表达式从左到右进行计算&#xff0c;并遵循优先级顺序&#xff0c;这与算术表达式非常类似。
在Java中使用正则表达式时
在Java中 正则表达式的\
需要变成双杠即\\
常用正则表达式
校验数字的表达式
数字&#xff1a;^[0-9]*$
n位的数字&#xff1a;^\d{n}$
至少n位的数字&#xff1a;^\d{n,}$
m-n位的数字&#xff1a;^\d{m,n}$
零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字&#xff1a;^([1-9][0-9]*)&#43;(.[0-9]{1,2})?$
带1-2位小数的正数或负数&#xff1a;^(\-)?\d&#43;(\.\d{1,2})?$
正数、负数、和小数&#xff1a;^(\-|\&#43;)?\d&#43;(\.\d&#43;)?$
有两位小数的正实数&#xff1a;^[0-9]&#43;(.[0-9]{2})?$
有1~3位小数的正实数&#xff1a;^[0-9]&#43;(.[0-9]{1,3})?$
非零的正整数&#xff1a;^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$
或^\&#43;?[1-9][0-9]*$
非零的负整数&#xff1a;^\-[1-9][]0-9"*$
或^-[1-9]\d*$
非负整数&#xff1a;^\d&#43;$
或 ^[1-9]\d*|0$
非正整数&#xff1a;^-[1-9]\d*|0$
或 ^((-\d&#43;)|(0&#43;))$
非负浮点数&#xff1a;^\d&#43;(\.\d&#43;)?$
或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0&#43;|0$
非正浮点数&#xff1a;^((-\d&#43;(\.\d&#43;)?)|(0&#43;(\.0&#43;)?))$
或^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0&#43;|0$
正浮点数&#xff1a;^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
或^(([0-9]&#43;\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]&#43;)|([0-9]*[1-9][0-9]*))$
负浮点数&#xff1a;^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
或 ^(-(([0-9]&#43;\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]&#43;)|([0-9]*[1-9][0-9]*)))$
浮点数&#xff1a;^(-?\d&#43;)(\.\d&#43;)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0&#43;|0)$
校验字符的表达式
汉字&#xff1a;^[\u4e00-\u9fa5]{0,}$
英文和数字&#xff1a;^[A-Za-z0-9]&#43;$
或^[A-Za-z0-9]{4,40}$
长度为3-20的所有字符&#xff1a;^.{3,20}$
由26个英文字母组成的字符串&#xff1a;^[A-Za-z]&#43;$
由26个大写英文字母组成的字符串&#xff1a;^[A-Z]&#43;$
由26个小写英文字母组成的字符串&#xff1a;^[a-z]&#43;$
由数字和26个英文字母组成的字符串&#xff1a;^[A-Za-z0-9]&#43;$
由数字、26个英文字母或者下划线组成的字符串&#xff1a;^\w&#43;$
或 ^\w{3,20}$
中文、英文、数字包括下划线&#xff1a;^[\u4E00-\u9FA5A-Za-z0-9_]&#43;$
可以输入含有 ^%&’,;&#61;?$\”
等字符&#xff1a;[^%&&#39;,;&#61;?$\x22]&#43;
禁止输入含有~的字符&#xff1a;[^~\x22]&#43;
特殊需求表达式
Email地址&#xff1a;^\w&#43;([-&#43;.]\w&#43;)*&#64;\w&#43;([-.]\w&#43;)*\.\w&#43;([-.]\w&#43;)*$
域名&#xff1a;[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})&#43;/.?
InternetURL&#xff1a;[a-zA-z]&#43;://[^\s]* 或 ^http://([\w-]&#43;\.)&#43;[\w-]&#43;(/[\w-./?%&&#61;]*)?$
手机号码&#xff1a;^(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}$
电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX)&#xff1a;^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
国内电话号码(0511-4405222、021-87888822)&#xff1a;\d{3}-\d{8}|\d{4}-\d{7}
身份证号(15位、18位数字)&#xff1a;^\d{15}|\d{18}$
短身份证号码(数字、字母x结尾)&#xff1a;^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
帐号是否合法(字母开头&#xff0c;允许5-16字节&#xff0c;允许字母数字下划线)&#xff1a;^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密码(以字母开头&#xff0c;长度在6~18之间&#xff0c;只能包含字母、数字和下划线)&#xff1a;^[a-zA-Z]\w{5,17}$
强密码(必须包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在8-10之间)&#xff1a;^(?&#61;.*\d)(?&#61;.*[a-z])(?&#61;.*[A-Z]).{8,10}$
日期格式&#xff1a;^\d{4}-\d{1,2}-\d{1,2}
一年的12个月(01&#xff5e;09和1&#xff5e;12)&#xff1a;^(0?[1-9]|1[0-2])$
一个月的31天(01&#xff5e;09和1&#xff5e;31)&#xff1a;^((0?[1-9])|((1|2)[0-9])|30|31)$
xml文件&#xff1a;^([a-zA-Z]&#43;-?)&#43;[a-zA-Z0-9]&#43;\\.[x|X][m|M][l|L]$
中文字符的正则表达式&#xff1a;[\u4e00-\u9fa5]
双字节字符&#xff1a;[^\x00-\xff]
(包括汉字在内&#xff0c;可以用来计算字符串的长度(一个双字节字符长度计2&#xff0c;ASCII字符计1))
空白行的正则表达式&#xff1a;\n\s*\r
(可以用来删除空白行)
HTML标记的正则表达式&#xff1a;<(\S*?)[^>]*>.*?|<.*? />
(网上流传的版本太糟糕&#xff0c;上面这个也仅仅能部分&#xff0c;对于复杂的嵌套标记依旧无能为力)
首尾空白字符的正则表达式&#xff1a;^\s*|\s*$
或(^\s*)|(\s*$)
(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)&#xff0c;非常有用的表达式)
腾讯QQ号&#xff1a;[1-9][0-9]{4,}
(腾讯QQ号从10000开始)
中国邮政编码&#xff1a;[1-9]\d{5}(?!\d)
(中国邮政编码为6位数字)
IP地址&#xff1a;\d&#43;\.\d&#43;\.\d&#43;\.\d&#43;
(提取IP地址时有用)
IP地址&#xff1a;((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
港澳居民来往内地通行证号码验证正则&#xff1a; /^([A-Z]\d{6,10}(\(\w{1}\))?)$/
护照验证正则&#xff1a; /^(P\d{7}|G\d{7,8}|TH\d{7,8}|S\d{7,8}|A\d{7,8}|L\d{7,8}|\d{9}|D\d&#43;|1[4,5]\d{7})$/
注&#xff1a;身份号码验证建议查看《关于身份证号码验证的几个实用函数》
钱的输入格式&#xff1a;
有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”&#xff1a;^[1-9][0-9]*$
这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式&#xff1a;^(0|[1-9][0-9]*)$
一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号&#xff1a;^(0|-?[1-9][0-9]*)$
这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分&#xff1a;^[0-9]&#43;(.[0-9]&#43;)?$
必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的&#xff1a;^[0-9]&#43;(.[0-9]{2})?$
这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样&#xff1a;^[0-9]&#43;(.[0-9]{1,2})?$
这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样&#xff1a;^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
1到3个数字,后面跟着任意个 逗号&#43;3个数字,逗号成为可选,而不是必须&#xff1a;^([0-9]&#43;|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
参考
https://www.html.cn/archives/7991