当前栏目
js正则表达式梳理
正则表达式简介
正则表达式(Regular Expression): 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的租和,组成一个“规则字符串”,这个规则字符串用来表达对字符串的一种过滤逻辑。
正则表达式的作用
- 给定的字符串是否符合正则表达式的过滤逻辑(匹配)。
- 可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)。
- 强大的字符串替换能力(替换)。
正则表达式的组成
- 普通字符 abc 中国 123 等
- 特殊字符(元字符、限定符、中括号):正则表达式中有特殊意义的字符。
元字符
元字符就是在正则表达式中具有特殊含义的字符。
元字符 | 说明 |
---|---|
. | 匹配任意除了换行符(回车键)之外的单个字符 |
\d | 匹配数字 |
\D | 匹配非数字 |
\w | 匹配字母、数字、下划线 |
\W | 匹配非字母、数字、下划线 |
\s | 匹配空格 |
\S | 匹配非空格 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\0 | 匹配NULL字符 |
\n | 匹配换行符 |
\t | 匹配制表符 |
\v | 匹配垂直制表符 |
\xxx | 查找以八进制数 xxxx 规定的字符 |
\uxxxx | 查找以十六进制 xxxx规定的 Unicode 字符 |
数量符
控制字符出现的次数,对字符个数限制
数量符 | 说明 |
---|---|
n* | 匹配任何包含零个或者多个n的字符串。n{0,} |
n+ | 匹配任何包含至少一个n的字符串。n{1,} |
n? | 匹配任何包含零个或一个n的字符串。{0,1} |
n{x} | 匹配包含x个n的序列的字符串。 |
n{x,} | 匹配包含至少x个n的序列的字符串。 |
n{x,y} | 匹配包含至少x个至多y个n的序列的字符串。 |
n$ | 匹配任何结尾为n的字符串。 |
^n | 匹配任何开头为n的字符串。 |
范围符
一个中括号就代表一个字符串,中括号的目的解视控制一个字符的范围。
中括号 | 说明 |
---|---|
[abc] | 查找一个括号之间的任何字符。 |
[^abc] | 查找一个任何不在方括号之间的字符,^在中括号中有取反的意思。 |
[0-9] | 查找一个任何从0至9的数字。 |
[a-z] | 查找一个任何从小写a到小写z的字符。 |
[A-Z] | 查找一个任何从大写A到大写Z的字符。 |
[A-z] | 查找一个字母(包含大小写和下划线)。 |
[[u4e00-u9fa5]] | 查找一个汉字。 |
选择符
特殊符号:正则1|正则2。 符合或两边其中一个就可以匹配。
如:google,baidu,bing; // 匹配三种其中一种字符串
正则:google|baidu|bing
组
特殊符号: (正则) ;
组指的是一个小集体,分组就是将一个大集体可以分成几个小集体。
如:控制你的名字连续出现的次数,最少1次,最多3次
正则:^(hyl){1,3}$
修饰符
修饰符 | 说明 |
---|---|
g | 全局匹配。 如: var reg = /hello/g |
i | 全局忽略大小写。 如: var reg = /Hello/i |
gi | 全局匹配且忽略大小写。 如: var reg = /Hello/gi |
位置符
位置符 | 说明 |
---|---|
^ | 匹配开头 |
$ | 匹配结尾 |
(?=p) | 符合p子模式前面的位置 |
(?!p) | 除了(符合p子模式前面的位置)的所有位置 |
(?<=p) | 符合p子模式后面的位置 |
(?<!p) | 除了(符合p子模式后面的位置)的所有位置 |
转义符
在正则中表示特殊符号。去除.的特殊意义,需要转义: \.
贪婪匹配 VS 惰性匹配
正则本身是贪婪的,会尽可能的多匹配符合模式的字符
1let regex = /\d{2,5}/g
2let string = "123 1234 12345 123456"
3// 贪婪匹配
4// string.match(regex) // [ 123, 1234, 12345, 12345 ]
5
6// 惰性匹配
7let regex2 = /\d{2,5}?/g
8// string.match(regex) // [ 12, 12, 34, 12, 34, 12, 34, 56 ]
9
量词后面加一个?,即变成了惰性匹配
js中使用正则表达式
1//方式1: 语法: var 变量 = new RegExp("规则","修饰符")
2var reg = new RegExp("d","g")
3
4//方式2: 语法:var 变量 = /正则表达式/ (推荐使用)
5var reg = /d/g;
相关正则方法
- 正则对象.test(字符串); 校验匹配正则的子字符串,返回布尔值。
- 字符串.match(正则对象); 获取匹配正则的子字符串,返回一个数组。
- 字符串.replace(正则对象,替换后的内容); 替换所匹配正则的子字符串。返回替换后的字符串。
替换类案例
字符串开头或结尾塞一个笑脸
1let string = "hello"
2
3console.log(string.replace(/^/, "?")) // ?hello
4console.log(string.replace(/$/, "?")) // hello?
数字千位分割
1let price = "123456789"
2let priceReg = /(?!^)(?=(\d{3})+$)/g
3
4console.log(price.replace(priceReg, ",")) // 123,456,789
手机号3-4-4转换
1const formatMobile = (mobile) => {
2 return String(mobile).slice(0,11)
3 .replace(/(?<=\d{3})\d+/, ($0) => "-" + $0)
4 .replace(/(?<=[\d-]{8})\d{1,4}/, ($0) => "-" + $0)
5}
6
7console.log(formatMobile(123)) // 123
8console.log(formatMobile(1234)) // 123-4
9console.log(formatMobile(12345)) // 123-45
10console.log(formatMobile(123456)) // 123-456
11console.log(formatMobile(1234567)) // 123-4567
12console.log(formatMobile(12345678)) // 123-4567-8
13console.log(formatMobile(123456789)) // 123-4567-89
14console.log(formatMobile(12345678911)) // 123-4567-8911
15
验证密码的合法性
密码长度是6-12位,由数字、小写字符和大写字母组成,但必须至少包括2种字符
1let reg = /((?=.*\d)((?=.*[a-z])|(?=.*[A-Z])))|(?=.*[a-z])(?=.*[A-Z])^[a-zA-Z\d]{6,12}$/
2
3console.log(reg.test("123456")) // false
4console.log(reg.test("aaaaaa")) // false
5console.log(reg.test("AAAAAAA")) // false
6console.log(reg.test("1a1a1a")) // true
7console.log(reg.test("1A1A1A")) // true
8console.log(reg.test("aAaAaA")) // true
9console.log(reg.test("1aA1aA1aA")) // true
10
相关文章
- 用js来实现那些数据结构12(散列表)
- 用js来实现那些数据结构11(字典)
- 用js来实现那些数据结构10(集合02-集合的操作)
- 用js来实现那些数据结构09(集合01-集合的实现)
- 用js来实现那些数据结构08(链表02-双向链表)
- 用js来实现那些数据结构07(链表01-链表的实现)
- 用js来实现那些数据结构06(队列)
- 用js来实现那些数据结构05(栈02-栈的应用)
- Html音频播放代码
- websocket-sharp 实现websocket
- FineUI通过js事件条用后台方法实现弹窗
- 复制内容到剪切板通用的js方法
- C#获取html标签内容的方法
- 主题样式选择效果代码及css样式
- 使用HtmlAgilityPack 爬取 国家统计局 区划和城乡划分代码
- js 全屏代码实现方法
- HTML导出Excel文件(兼容IE及所有浏览器)
- web HTML5 调用摄像头的代码
- PHP调用WebService
- js判断输入字符串长度(汉字算两个字符,字母数字算一个)