正则表达式基础
使用test( )方法
测试正则表达式的一种方法是使用.test()方法。
var testStr = "You are a genius";
var testRegex = /are/; // 注意, /are/ 不需要引号
var hasAre = testRegex.test(testStr); // 返回 true
console.log(hasAre);
匹配文字字符串
/Are/ 只能匹配到Are 不能匹配到ARE或者are
匹配多种可能性的文字字符串
同时需要匹配cat或 dog或 bird
/cat|dog|bird/
忽视大小写
可以通过忽视大小写的标志i实现
/dog|cat|bird/i
使用match( )方法提取匹配项
使用indexOf和lastIndexOf可以获取字符串的位置
使用.match直接返回字符串
testString.match(testRegx)
全局匹配
可以使用多个标志 /dog/ig
/dog/ 只能进行一次搜索提取
/dog/g 可以进行多次搜索提取
使用通配符.匹配任何内容
例如想同时匹配hug hut hum hun
/hu./即可
单个字符多可能性匹配
使用字符串匹配/dog/和使用通配符匹配/d.g/是两种极端情况但又是需要更加精确.使用字符集[ ]
/d[oiu]/只能匹配dog dig dug
匹配字母表中的字母和数字
/[a-e]at/gi //使用连字符-表示从a到e
/[0-6]/gi //表示数字0到6
/[a-e0-6]/gi //表示字母a-e以及数字0-6
创建否定字符集
在开头使用字符^
/[^0-9aeiou]/ig //匹配所有非数字和元音字符
匹配出现一次或者多次的字符串
使用符号+
/s+/g //匹配出现一次多次s的字符
匹配出现0次或者多次的字符串
使用符号*
/go*/ //匹配结果可以为g go goo gooo
用惰性匹配来查找字符
贪婪匹配最长 惰性匹配使用字符?匹配最短
var str = "titanic";
var regex1 = /t[a-z]*i/;
var regex2 = /t[a-z]*?i/;
console.log( str.match(regex1) ); // 返回为 ["titani"]
console.log( str.match(regex2) ); // 返回为 ["ti"]
/<h.*?1>/ //返回<h1>
匹配字符串的开头
当^在字符集内时表示否定 在字符集外时表示匹配开头
var firstString = "Loen is first and can be found.";
var firstRegex = /^Loen/;
console.log( firstRegex.test(firstString) ); // 返回 true
var notFirst = "You can't find Loen";
console.log( firstRegex.test(notFirst) //返回false
匹配字符串的结尾
使用字符$
var LastRegex =/Loen$/;
var Last = "You can't find Loen";
console.log( LastRegex.test(Last) //返回true
匹配所有字母和数字
/[a-zA-Z0-9]+/ == /\w/
匹配所有的数字
/[0-9]/ == /\d/
匹配所有非数字
/[^0-9]/ == /\D/
元字符
| 元字符 | 描述 |
|---|---|
| · | 查找单个字符,除了换行和结束符 |
| \w | 查找单词字符 |
| \W | 查找非单词字符 |
| \d | 查找数字 |
| \D | 查找非数字字符 |
| \s | 查找空白字符 |
| \S | 查找非空白字符 |
| \b | 匹配单词边界 |
| \B | 匹配非单词边界 |
| \0 | 查找NULL字符 |
| \n | 查找换行符 |
| \f | 查找换页符 |
| \r | 查找回车符 |
| \t | 查找制表符 |
| \v | 查找垂直制表符 |
| \xxx | 查找以八进制数xxxx规定的字符 |
| \xdd | 查找以十六进制数dd规定的字符 |
| \uxxxx | 查找以十六进制xxxx规定的Unicode字符 |
限制可能的用户名
- 用户名只能是数字字母字符。\
- 用户名中的数字必须在最后,且数字可以有零个或多个。\
- 用户名字母可以是小写字母和大写字母。\
- 用户名长度必须至少为两个字符。
两位用户名只能使用字母。
var username = "JackOfAllTrades";
var userCheck = /^[a-z]([0-9]{2,}|[a-z]+\d*)$/i;
var result = userCheck.test(username);
console.log(result);
指定匹配的上限和下限
/a{3,5}h/ //匹配出现3-5次a的字符串
/a{3,}h/ //匹配出现3次以上a的字符串
/a{3}h/ //匹配出现3次a的字符串
正向先行断言和负向先行断言
正向先行断言的用法是(?=...)其中...就是需要存在但不会被匹配的部分。会先查看并确保搜索匹配模式中的元素存在但不会被匹配的部分
负向先行断言的用法是(?!...)其中...是希望不存在的匹配模式。会先查看确保搜索匹配模式中的元素不存在
var pwRegex = /^(?=\w{6})(?=\D+\d{2})/;//大于5个字符且有两个连续数字的密码,并且不能以数字开头
var checkPass = /(?=\w{3,6})(?=\D*\d)/; //3-6个字符且至少包含一个数字
检查混合字符串
var myString = "Eleanor Roosevelt";
var myRegex = /(Franklin|Eleanor).*Roosevelt/g;
var result = myRegex.test(myString);
console.log(result);
使用捕获组重用模式
使用捕获组搜寻重复的子字符串。括号()可以用来匹配重复的子字符串。只需要把重复匹配模式的正则表达式放在括号即可。要指定重复字符串将出现的位置,可以用反斜杠\后接一个数字,数字从1开始,随着你使用的每一个捕获组的增加而增加。
例子:
var repeatStr = "regex regex";
var repeatRegex = /(\w+)\s\1/;
console.log( repeatRegex.test(repeatStr) ); // 返回 true
console.log( repeatStr.match(repeatRegex) ); // 返回 ["regex regex", "regex"]
例子:匹配在字符串中仅重复三次的数字,每一个都由空格分隔。
var repeatNum = "42 42 42";
var reRegex = /^(\d+)\s\1\s\1$/;
var result = reRegex.test(repeatNum);
console.log(result);
使用捕获组搜索和替换
使用.replace方法来搜索并替换字符串的文本。输入参数首先是要搜索的匹配模式,第二个参数是用于替换匹配的字符串或用于执行某些操作的函数。
例子:
var wrongText = "The sky is silver.";
var silverRegex = /silver/;
console.log( wrongText.replace(silverRegex, "blue") ); // 返回 "The sky is blue."
还可以使用$访问替换字符串中的捕获组
let res = "Code Learn".replace(/(\w+)\s(\w+)/, '$2 $1'); // 返回 "Learn Code"
console.log(res);
删除开头和结尾的空白
有时字符串周围存在的空白字符并不是必须的,需要删除开头和结尾处的空格
var hello = " Hello, World! ";
var wsRegex = /^(\s+)(.+[^\s])(\s+)$/;
var result = hello.replace(wsRegex, '$2');
console.log(result);
常用正则表达式
注:
作者:晴天有点孤单 链接:juejin.cn/post/684490…
特殊需求
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]* 或 ^http://([\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 电话号码:^(\(\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}$
8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\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 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
16 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
17 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
18 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
19 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$\
20 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
21 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
22 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$\
23 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
24 中文字符的正则表达式:[\u4e00-\u9fa5]
25 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
26 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
27 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*?/> (对于复杂的嵌套标记依旧无能为力)
28 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
29 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
30 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
31 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
校验字符
1 汉字:^[\u4e00-\u9fa5]{0,}$
2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符:^.{3,20}$
4 由26个英文字母组成的字符串:^[A-Za-z]+$
5 由26个大写英文字母组成的字符串:^[A-Z]+$
6 由26个小写英文字母组成的字符串:^[a-z]+$
7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12 禁止输入含有~的字符:[^~\x22]+
校验数字
1 数字:^[0-9]*$
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 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:^-[1-9]\d*$
13 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\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 正浮点数:^[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]*))$
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)$