# 简单正则表达式使用


这里做一个笔记，整理了各大网站里关于正则表达式的知识，以备后面查询。
主要涉及两个方面：

1. 正则表达式书写规则
2. 常用正则表达式
<!--more-->

## 正则表达式简单用法

常用元字符

 |  代码  |  说明
 | :- | :-
 | . | 匹配除换行符以外的任意字符
 | \\w | 匹配字母或数字或下划线
 | \\s | 匹配任意的空白符
 | \\d | 匹配数字
 | \\b | 匹配单词的开始或结束
 | ^ | 匹配字符串的开始
 | $ | 匹配字符串的结束

常用限定符

 | 代码/语法 | 说明
 | :- | :-
 | * | 重复零次或更多次
 | + | 重复一次或更多次
 | ? | 重复零次或一次
 | {n} | 重复n次
 | {n,} | 重复n次或更多次
 | {n,m} | 重复n到m次

常用反义词

 | 代码/语法 | 说明
 | :- | :-
 | \\W | 匹配任意不是字母，数字，下划线，汉字的字符
 | \\S | 匹配任意不是空白符的字符
 | \\D | 匹配任意非数字的字符
 | \\B | 匹配不是单词开头或结束的位置
 | \[^x\] | 匹配除了x以外的任意字符
 | \[^aeiou\] | 匹配除了aeiou这几个字母以外的任意字符

<!-- 
## 常用正则表达式

<div>
		<h2>一、校验数字的表达式</h2>
<ul>
<li>数字：<strong>^[0-9]*$</strong></li>
<li> n位的数字：<strong>^\d{n}$</strong></li>
<li> 至少n位的数字<strong>：^\d{n,}$</strong></li>
<li> m-n位的数字：<strong>^\d{m,n}$</strong></li>
<li> 零和非零开头的数字：<strong>^(0 | [1-9][0-9]*)$</strong></li>
<li> 非零开头的最多带两位小数的数字：<strong>^([1-9][0-9]*)+(\.[0-9]{1,2})?$</strong></li>
<li> 带1-2位小数的正数或负数：<strong>^(\-)?\d+(\.\d{1,2})$</strong></li>
<li> 正数、负数、和小数：<strong>^(\- | \+)?\d+(\.\d+)?$</strong></li>
<li> 有两位小数的正实数：<strong>^[0-9]+(\.[0-9]{2})?$</strong></li>
<li> 有1~3位小数的正实数：<strong>^[0-9]+(\.[0-9]{1,3})?$</strong></li>
<li> 非零的正整数：<strong>^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$</strong></li>
<li> 非零的负整数：<strong>^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$</strong></li>
<li> 非负整数：<strong>^\d+$ 或 ^[1-9]\d* | 0$</strong></li>
<li> 非正整数：<strong>^-[1-9]\d* | 0$ 或 ^((-\d+) | (0+))$</strong></li>
<li> 非负浮点数：<strong>^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d* | 0\.\d*[1-9]\d* | 0?\.0+ | 0$</strong></li>
<li> 非正浮点数：<strong>^((-\d+(\.\d+)?) | (0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d* | 0\.\d*[1-9]\d*)) | 0?\.0+ | 0$</strong></li>
<li> 正浮点数：<strong>^[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]*))$</strong></li>
<li> 负浮点数：<strong>^-([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]*)))$</strong></li>
<li> 浮点数：<strong>^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d* | 0\.\d*[1-9]\d* | 0?\.0+ | 0)$</strong></li></ul>

<hr>
<h2>二、校验字符的表达式</h2>
<ul>
<li>汉字：<strong>^[\u4e00-\u9fa5]{0,}$</strong></li>
<li>英文和数字：<strong>^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$</strong></li>
<li>长度为3-20的所有字符：<strong>^.{3,20}$</strong></li>
<li>由26个英文字母组成的字符串：<strong>^[A-Za-z]+$</strong></li>
<li>由26个大写英文字母组成的字符串：<strong>^[A-Z]+$</strong></li>
<li>由26个小写英文字母组成的字符串：<strong>^[a-z]+$</strong></li>
<li>由数字和26个英文字母组成的字符串：<strong>^[A-Za-z0-9]+$</strong></li>
<li>由数字、26个英文字母或者下划线组成的字符串：<strong>^\w+$ 或 ^\w{3,20}$</strong></li>
<li>中文、英文、数字包括下划线：<strong>^[\u4E00-\u9FA5A-Za-z0-9_]+$</strong></li>
<li>中文、英文、数字但不包括下划线等符号：<strong>^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$</strong></li>
<li>可以输入含有^%&',;=?$\"等字符：<strong>[^%&',;=?$\x22]+</strong></li>
<li>禁止输入含有~的字符：<strong>[^~\x22]+</strong></li></ul>

<hr>
<h2>三、特殊需求表达式</h2>
<ul>
<li>Email地址：<strong>^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$</strong></li>
<li>域名：<strong>[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?</strong></li>
<li>InternetURL：<strong>[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$</strong></li>
<li>手机号码：<strong>^(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}$</strong></li>
<li>电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)：<strong>^(\(\d{3,4}-) | \d{3.4}-)?\d{7,8}$ </strong></li>
<li>国内电话号码(0511-4405222、021-87888822)：<strong>\d{3}-\d{8} | \d{4}-\d{7}</strong></li>
<li>电话号码正则表达式（支持手机号码，3-4位区号，7-8位直播号码，1－4位分机号）: <strong>((\d{11}) | ^((\d{7,8}) | (\d{4} | \d{3})-(\d{7,8}) | (\d{4} | \d{3})-(\d{7,8})-(\d{4} | \d{3} | \d{2} | \d{1}) | (\d{7,8})-(\d{4} | \d{3} | \d{2} | \d{1}))$)</strong></li>
<li>身份证号(15位、18位数字)，最后一位是校验位，可能为数字或字符X：<strong>(^\d{15}$) | (^\d{18}$) | (^\d{17}(\d | X | x)$)</strong></li>
<li>帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：<strong>^[a-zA-Z][a-zA-Z0-9_]{4,15}$</strong></li>
<li>密码(以字母开头，长度在6~18之间，只能包含字母、数字和下划线)：<strong>^[a-zA-Z]\w{5,17}$</strong></li>
<li>强密码(必须包含大小写字母和数字的组合，不能使用特殊字符，长度在 8-10 之间)：<strong>^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$  </strong></li>
<li>强密码(必须包含大小写字母和数字的组合，可以使用特殊字符，长度在8-10之间)：<strong>^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$  </strong></li>
<li>日期格式：<strong>^\d{4}-\d{1,2}-\d{1,2}</strong></li>
<li>一年的12个月(01～09和1～12)：<strong>^(0?[1-9] | 1[0-2])$</strong></li>
<li>一个月的31天(01～09和1～31)：<strong>^((0?[1-9]) | ((1 | 2)[0-9]) | 30 | 31)$ </strong></li>
<li>钱的输入格式：<ol>
<li>    有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000"：<strong>^[1-9][0-9]*$ </strong></li>
<li>    这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式：<strong>^(0 | [1-9][0-9]*)$ </strong></li>
<li>    一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号：<strong>^(0 | -?[1-9][0-9]*)$ </strong></li>
<li>    这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分：<strong>^[0-9]+(.[0-9]+)?$ </strong></li>
<li>    必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的：<strong>^[0-9]+(.[0-9]{2})?$ </strong></li>
<li>    这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样：<strong>^[0-9]+(.[0-9]{1,2})?$ </strong></li>
<li>    这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样：<strong>^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ </strong></li>
<li>    1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须：<strong>^([0-9]+ | [0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ </strong></li>
<li>    备注：这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里</li></ol></li>
<li>xml文件：<strong>^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x | X][m | M][l | L]$</strong></li>
<li>中文字符的正则表达式：<strong>[\u4e00-\u9fa5]</strong></li>
<li>双字节字符：<strong>[^\x00-\xff]    (包括汉字在内，可以用来计算字符串的长度(一个双字节字符长度计2，ASCII字符计1))</strong></li>
<li>空白行的正则表达式：<strong>\n\s*\r    (可以用来删除空白行)</strong></li>
<li>HTML标记的正则表达式：<strong><(\S*?)[^>]*>.*?</\1> | <.*? />    (首尾空白字符的正则表达式：^\s* | \s*$或(^\s*) | (\s*$)    (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式)</strong></li>
<li>腾讯QQ号：<strong>[1-9][0-9]{4,}    (腾讯QQ号从10000开始)</strong></li>
<li>中国邮政编码：<strong>[1-9]\d{5}(?!\d)    (中国邮政编码为6位数字)</strong></li>
<li>IP地址：<strong>((?:(?:25[0-5] | 2[0-4]\\d | [01]?\\d?\\d)\\.){3}(?:25[0-5] | 2[0-4]\\d | [01]?\\d?\\d)) </strong></li></ul>
</div>-->

## 正则表达式学习网站

[正则表达式在线测试-站长工具](http://tool.chinaz.com/regex/)
[正则表达式在线测试-菜鸟工具](https://c.runoob.com/front-end/854)
[正则表达式教程-菜鸟教程](http://www.runoob.com/regexp/regexp-syntax.html)

