正则相关知识点整理

正则的符号及其含义及常用方法的整理

1 符号及其含义

1
2
3
4
5
6
*  重复0+次
+ 重复1+次
? 重复0或1次
{n} 重复n次
{n,} 重复n+次
{n,m} 重复n-m次

2 正则一些常用方法

test()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new RegExp('Nola','i')   // /Nola/i
/No/.test('Nola') // true

//匹配数字
/[0123456789]/.test('3') // true
/[0-9]/.test('3') // true
/[^0-9]/.test('3') // false 正则里[]中的^是取反的意思,非
/\d/.test('3') // true

//匹配字母数字
/[a-zA-Z]/.test('abc123') // true
/\w/.test('abc3') // true

//其他
/./.test('abc123') // true 点可以匹配任何东西,除了换行符号

search()类似于indexOf()

1
2
'Nola'.search(/o/)   // 1
'Nola'.search(/x/) // -1 不匹配返回-1,类似于indexOf()

match()可以将字符串转化成数组的形式

1
2
3
4
5
6
'Date 2018-08-07 2018-09-15'.match(/\d{4}-\d{2}-\d{2}/)
// ["2018-08-07"]
'Date 2018-08-07 2018-09-15'.match(/\d{4}-\d{2}-\d{2}/g)
// ["2018-08-07", "2018-09-15"]
'1 comment 1,23 comments'.match(/[\d,]+ comments?/g)
// ["1 comment","1,23 comment"] //如果不加g只会返回第一个

string.matches()

这个方法主要是返回是否匹配指定的字符串,如果匹配则为true,否则为false;

replace()匹配并替换

1
2
3
//[ ] \ ^ $ . | ? * + ( )需要转义,[] 之间的特殊字符一般不需要转义
'2018.08.07'.replace(/\./g, '-')
// "2018-08-07"

输入框只能输入数字

1
2
3
onkeyup=“this.value=this.value.replace(/[^\d]/g,’’) “ 
onafterpaste=“this.value=this.value.replace(/[^\d]/g,’’) “
//onafterpaste作用:防止用户从其它地方copy内容粘贴到输入框

输入框只能输入字母和下横线的正则表达式

1
2
onkeyup="this.value=this.value.replace(/[^_a-zA-Z]/g,'')" 
onpaste="this.value=this.value.replace(/[^_a-zA-Z]/g,'')"

输入框只能输入字母数字和下横线的正则表达式

1
2
3
4
5
6
//第一种方法
onkeyup="this.value=this.value.replace(/[^\w]/g,'')"
onpaste="this.value=this.value.replace(/[^\w]/g,'')"
//第二种方法
onkeyup="this.value=this.value.replace(/[\W]/g,'')"
onpaste="this.value=this.value.replace(/[\W]/g,'')"

测试是否是数字/替换非数字部分

1
2
/^[0-9]*$/.test(num))            //测试输入的是不是数字
num=num.replace(/[^0-9]+/ig,"") //替换掉不是数字的部分

3 贪婪模式和懒惰模式

贪婪模式 /'.*'/g.* 是贪婪的,会尽可能的匹配多。包括匹配的两者之间的

1
2
"there is 'Lola' and 'Nola'".match(/'.*'/g)
// ["'Lola' and 'Nola'"]

懒惰模式.* 设置懒惰模式成 .*?。其中指0或1次

1
2
"there is 'Lola' and 'Nola'".match(/'.*?'/g)
// ["'Lola','Nola'"]

4 分组捕获和排除分组

分组捕获模式即一对括号 () 包围的模式, []是定义匹配的字符范围

1
2
3
4
5
'127.0.0'.match(/(\d{1,3}\.){2}\d{1,3}/g)
// ["127.0.0"] ()分组即让(\d{1,3}\.)成为一个整体{3}即出现3次
//$1代表第一个分组捕获的内容
'I am Nola from ShangHai'.replace(/I am (\w{4}) from ShangHai/,'我是来自上海的 $1')
// "我是来自上海的 Nola"

排除分组在分组添加 ?: 可进行排除如(?:\d+)$/)。() 中的 | 表示 或。
Ps:正则的 m 标记 /…/m 表示多行模式,它会影响 ^$ 的表现。