正则表达式
正则(RegExp是一个描述字符模式的对象。我理解为在正式场合的规则,它就是一条规则,来约束内容的。前端用正则的地方基本就是表单的验证 ,敏感词处理,用的都是简单的正则,python爬虫就用到了很深奥的正则。
正则用处够进行强大的“模式匹配”和“文本检索与替换”功能,采用正则表达式会使得数据校验的工作量大大减轻。
构建方式
-
RegExp构造函数 (两个参数)
- 第一参数
模式“字符串”
var reg = new RegExp('study');
- 第二参数可选,模式修饰符
i: 忽略大小写
g:全局匹配,不写只会匹配到第一次就停止
m:多行匹配
var reg = new RegExp('study', 'ig');
-
字面量方式直接声明
var reg = /study/gi; // 斜杠里面的是正则
使用
支持正则的字符串方法
-
match()匹配得到一个数组
- 默认匹配字符串,返回一个数组
- 0:所匹配的字符
- index:匹配第一个字符所在的索引
- input:对字符串的引用
- 默认匹配字符串,返回一个数组
-
replace(‘垃圾’,’***’) 替换,匹配到的数据换成其他的,敏感词处理
-
search() 返回第一次匹配时所在的索引值,如果匹配不到则返回-1
属性和方法
-
测试正则表达式用test方法,返回布尔值
- 格式:正则表达式.test(字符串)
- 用<正则表达式>测试<字符串>是否匹配,返回true/false
-
测试正则表达式exec方法
- 返回数据 提取数据,返回符合规则的数据
/xx/.exec(字符串)
匹配规则
-
所有字母和数字都是按照字面量进行匹配,和字符串匹配等效
/good/gi
-
字符类(只记小写字母即可)
-
.
: 除换行以外的字符 -
\w : 代表数字或字母或下划线
-
\W : 非数字字母和下划线字符
-
\d : 数字
-
\D : 非数字
-
\s : 代表一个空格
-
\S : 空格以外的字符
-
\b : 匹配一个单词边界,也就是指单词和空格间的位置
-
\B : 匹配非单词边界。
PS:以上所有字符类都只是匹配“一个”字符
-
-
特殊符号
^ $ . * + ? = ! : | \ / () [] {}
-
[]: 代表任意“单个字符” ,里面的内容表示“或”的关系
-
-: 代表范围
-
^: 代表非
[abc] : a或b或c,单个字母 a t ab
[abc]e : ae或be或ce
[a-z]9 : a到z任意一个小写字母和9组合
[a-zA-Z0-9] :任意个字母或数字
[a-zA-Z0-9_] 代表数字或字母或下划线 \w
-
-
(): 表示分组(n是以最左边括号出现的顺序排列)
-
$1: 表示第一个分组
-
$n: 表示第n个分组(不能写在正则表达式里)
-
\n: 在正则分组后面使用,表示对第n个分组的引用(一定要写在正则表达式里)
PS: 编写的正则分组数量越少越好
-
-
|: 表示或者
-
锚点定位
- ^: 表示以什么开头
- $: 表示以什么结尾
-
表示数量,对前一个字符计数,
-
*: 代表0个或0个以上 <===>{0,}
-
+: 代表1个或1个以上 <===>{1,}
-
?: 代表0个或1个 <===>{0,1}
-
{}:
\d{5}: 匹配5个数字 \d{5,10}: 匹配5个到10个数字 \d{5,}: 匹配5个或5个以上的数字
PS:
1)数量词*,+,{5,},会尽可能多的去匹配结果(贪婪)
2)在后面加一个?表示尽可能少的去匹配结果(非贪婪)
google,goooogle ==> /go+/ -
-
正则不是一两天就能学会的,太抽象,只有多用才能记住。
以下内容来自菜鸟工具附链接,非本人所写。复制过来便于查找。
一、校验数字的表达式
- 数字:
^[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})$
- 正数、负数、和小数:^(-|+)?\d+(.\d+)?$
- 有两位小数的正实数:
^[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*)$ 或 ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$
- 浮点数:^(-?\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}$
- 可以输入含有^%&’,;=?KaTeX parse error: Can't use function '\"' in math mode at position 1: \̲"̲等字符:**[^%&',;=?\x22]+**
- 禁止输入含有~的字符:
[^~\x22]+
三、特殊需求表达式
- 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-./?%&=]*)?$
- 手机号码:^(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):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
- 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
- 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\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}))$)
- 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(\d{15}$)|(^\d{18}$)|(\d{17}(\d|X|x)$)
- 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$
- 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
- 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
- 日期格式:^\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)$
- 钱的输入格式:
- 有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:
^[1-9][0-9]\*$
- 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
- 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
- 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:
^[0-9]+(.[0-9]+)?$
- 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 “10” 和 “10.2” 是通过的:
^[0-9]+(.[0-9]{2})?$
- 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:
^[0-9]+(.[0-9]{1,2})?$
- 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:
^[0-9]{1,3}(,[0-9]{3})\*(.[0-9]{1,2})?$
- 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
- 备注:这就是最终结果了,别忘了"+“可以用”*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
- 有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:
- xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
- 中文字符的正则表达式:[\u4e00-\u9fa5]
- 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
- 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
- HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*KaTeX parse error: Expected group after '^' at position 3: 或(^̲\s\*)|(\s\*) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
- 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
- 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
- IP地址:
(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))