一、概念语法介绍

英文名 regular expression(简写regex),由字母数字特殊符号构成的描述字符串模式的表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

1.功能

1.模糊匹配。2.文本的检索。3.替换功能。

2.创建方式

构造方法:

var reg = new RegExp(‘表达式’)第二个参数修饰符 i忽略大小写 m多行匹配 g全文匹配

字面量 隐式 直接量

var reg = /表达式/修饰符

3.正则表达式的常用方法

1.test(str)

返回true匹配 false不匹配

2.exec(str)

找到返回数组,否则返回null

4.支持正则的字符串的方法

1.replace() replaceAll()

2.split()

3.match()

1
2
"http://www.baidu.com?name=张三&age=19".match(/(\?|&)\w+=[\u4e00-\u9fa5\w#]+/g)
// ['?name=张三', '&age=19']

返回字符串中第一个与regexp相匹配的子串的起始位置。如果没有找到,返回-1。

不执行全局匹配,自动忽略g。同时忽略regexp的lastIndex值,总是从字符串的开始进行检索。

二、如何写正则表达式

元字符(特殊字符)

1
2
3
4
5
6
7
8
9
10
11
12
^   // 开头
[] // 匹配括号内的任一个字符 例如[0-9]
[^...] // 匹配除了括号内的任意字符
\d // 数字
\D // 非数字
\w // 字母数字下划线
\W // 非字母数字下划线
. // 除了换行符以外的任意字符
\b // 单词边界
\B // 非单词边界
() // 选择
$ // 结束

非打印字符

1
2
3
4
5
\s   // 空格
\S // 非空格
\n // 换行
\r // 回车符
\t //制表符

限定符

1
2
3
4
5
6
{6}   // 匹配前一项6次
{6,10}
{6,}
// 0或1次,相当于{0,1}
+ // 1到多次,相当于{1,}
* // 0或多次,相当于{0,}

转义字符

1
2
语法: \元字符
这些元字符需要转义 [] {} () ? * + / ^ & . |

特例

1
2
3
[\u4e00-\u9fa5] // 汉字 巧记规则:有事100,有酒罚我
[\x00-\xff] // 单字符
[^\x00-\xff] // 双字符

分组

() $1

三、正则表达式的一些例子,可做参考

1.将一个汉字统计为两个字符

1
2
3
const reg = /[\u4e00-\u9fa5]/g
let str1 = str.replace(reg,'**')
console.log(str1.length)

2.判断是否为全数字

1
2
3
4
const reg = /\D/
if(!reg.test(pwd)){
alert('密码不能全为数字')
}

3.字符串去重

1
2
3
let str = 'aaabbbccccdddd'
let res = str.replace(/(.)(\1)+/g,function($1,$2,$3){return $2})
console.log(res) // 'abcd'

4.将数字改为千分形式

1
'12456.33'.replace(/\B(?=(\d{3})+(?!\d))/g,",")

5.判断一个串是否符合规则

1
2
3
4
5
6
7
8
9
{validator:(rule, value, callback) => {
var reg = /^[0-9a-zA-Z]*$/g
if (!reg.test(value)) {
callback('只能输入数字字母')
}
callback()
},trigger: 'blur'}
// /^[0-9a-zA-Z]*$/g.test('faf,')
// false 因为有逗号

6.一段文字替换话题为高亮

1
2
3
4
5
6
7
// 话题是#开头 空格结尾
'#发发 发 adf #3阿斯顿发 #发发 #找我玩 啊发发'.replace(/(#[^#\s]\S*)/g,`<$1>`)
// '<#发发> 发 adf <#3阿斯顿发> <#发发> <#找我玩> 啊发发'

// 话题是#开头 #空格结尾 中间不能有空格
'#发 发# ##发 adf # 发不发# ##找#我玩# 啊发发'.replace(/(#[^#\s]*#\s)/g,`<$1>`)
// 只有#我玩#被匹配