正则表达式
2023-01-13 本文已影响0人
紫月凌枫
一、创建一个正则表达式
你可以使用以下两种方法构建一个正则表达式:
1.1 使用一个正则表达式字面量
其由包含在斜杠之间的模式组成,如下所示:
const re = /ab+c/;
脚本加载后,正则表达式字面量就会被编译。当正则表达式保持不变时,使用此方法可获得更好的性能。
1.2 调用RegExp对象的构造函数
如下所示:
let re = new RegExp("ab+c");
在脚本运行过程中,用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式。
二、编写一个正则表达式的模式
2.1 使用简单模式
简单模式是由你想直接找到的字符构成。
比如:
/abc/ 这个模式就能且仅能匹配 "abc" 字符按照顺序同时出现的情况。
在"Hi, do you know your abc's?" 和 "The latest airplane designs evolved from slabcraft."中会匹配成功。
上述两个例子中,匹配的子字符串是 "abc"。但是在 "Grab crab" 中会匹配失败,因为它虽然包含子字符串 "ab c",但并不是准确的 "abc"。
2.2 使用特殊字符
当你需要匹配一个不确定的字符串时,比如寻找一个或多个 "b",或者寻找空格,可以在模式中使用特殊字符。
比如:
你可以使用 /abc/ 去匹配一个单独的 "a" 后面跟了零个或者多个 "b",同时后面跟着 "c" 的字符串,的意思是前一项出现零次或者多次。
在字符串 "cbbabbbbcdebc" 中,这个模式匹配了子字符串 "abbbbc"。
1.常用元字符
表达式 | 可匹配 |
---|---|
\d | 任意一个数字,0~9 中的任意一个 |
\w | 任意一个字母或数字或下划线,也就是 A-Z,a-z,0~9,_ 中任意一个 |
\s | 包括空格、制表符、换页符等空白字符的其中任意一个 |
. | 小数点可以匹配除了换行符(\n)以外的任意一个字符 |
\b | 匹配单词(起始位置必须是各种空白符)的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
2.常用的限定符
表达式 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n次或m次 |
三、使用正则表达式
方法 | 描述 |
---|---|
exec | 一个在字符串中执行查找匹配的 RegExp 方法,它返回一个数组(未匹配到则返回 null)。 |
test | 一个在字符串中测试是否匹配的 RegExp 方法,它返回 true 或 false。 |
match | 一个在字符串中执行查找匹配的 String 方法,它返回一个数组,在未匹配到时会返回 null。 |
matchAll | 一个在字符串中执行查找所有匹配的 String 方法,它返回一个迭代器(iterator)。 |
search | 一个在字符串中测试匹配的 String 方法,它返回匹配到的位置索引,或者在失败时返回 -1。 |
replace | 一个在字符串中执行查找匹配的 String 方法,并且使用替换字符串替换掉匹配到的子字符串。 |
split | 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。 |
以exec为例:
const regex = /d(b+)d/g;
const regArray = regex.exec("cdbbdbsbz");
如果你不需要访问正则表达式的属性,这个脚本通过另一个方法来创建 myArray:
const regArray = /d(b+)d/g.exec("cdbbdbsbz");
// 和 "cdbbdbsbz".match(/d(b+)d/g); 相似。
// 但是 "cdbbdbsbz".match(/d(b+)d/g) 输出数组 [ "dbbd" ],
// 而 /d(b+)d/g.exec('cdbbdbsbz') 输出数组 [ "dbbd", "bb", index: 1, input: "cdbbdbsbz" ].
如果你想通过一个字符串构建正则表达式,那么这个脚本还有另一种方法:
const regex = new RegExp("d(b+)d", "g");
const regArray = regex.exec("cdbbdbsbz");
四、常用正则合集
1、校验合法url
/^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
2、校验手机号码
/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[289])\d{8}$/
3、校验国内座机电话
/\d{3}-\d{8}|\d{4}-\d{7}/
4、校验身份证
/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
5、校验车牌号
/^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/
6、校验email地址
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
7、检验账号名称(只能由字母、数字、下划线组成,且以字母开头,8-20位)
/^[a-zA-Z][a-zA-Z0-9_]*{8,20}$/
8、检验密码(8-20位含字母、数字的密码)
/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,20}$/
9、纯字母
/^[a-zA-Z]*$/
10、纯中文
/^[\u4E00-\u9FA5]/
11、整数
/^-?\d+$/
12、整数且大于0
/^([1-9]\d*(\.\d+)?|0)$/
13、小数
/^\d+\.\d+$/
14、正整数、小数或0
/^\d+(\.?|(\.\d+)?)$/
15、上传图片类型
/image\/(png|jpg|jpeg|gif)$/
16、域名
/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?/
17、qq号
/^[1-9]*[1-9][0-9]*$/
18、微信号
/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/
19、ipv4地址
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
20、日期格式,yyyy-mm-dd
/^\d{4}(-)\d{1,2}\1\d{1,2}$/
验证昵称是否为中文、英文、数字或者下划线,且长度为1到10。
const regex = /^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z0-9_]){1,10}$/;
regex.test('xdsfsf是否fs')
参考链接: