RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配。通常用于格式验证、正则替换、查找子串等,各种编程语言的正则表达式基本相同,不同的语言可能会有一些细小的差别

申明:

1
2
3
4
// 实例化创建
var re = new RegExp(pattern, flags)
// 隐式创建
var re = /pattern/flags

参数 flags 是一个可选的字符串,包含属性 “g”(global 全局匹配)、”i” (ignoreCase 忽略大小写)

两种创建方式几乎没有什么区别,但需要匹配的内容要当做参数传入时,必须要用实例化的方式创建

RegExp 对象方法

re.test(string)

检索字符串中是否存在指定的值。返回值是 true 或 false

1
2
3
4
var patt1 = new RegExp('e') 
console.log(patt1.test('some text')); //true
var patt2 = new RegExp('ee')
console.log(patt2.test('some text')); //false

re.exec(string)

检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null

1
2
3
4
var patt1 = new RegExp('e')
console.log(patt1.exec('some text')); //e
var patt2 = new RegExp('ee')
console.log(patt2.exec('some text')); //null

支持正则表达式的 String 对象的方法

检索与正则表达式相匹配的值,找到返回位置,否则返回-1,类似于indexOf

1
2
var str = "Visit myblog"
console.log(str.search(/myblog/)) //6

match

检索与正则表达式相匹配的值,找到返回所有匹配成功字符串组成的数组,否则返回null

1
2
var str="1 plus 2 equal 3"
console.log(str.match(/\d+/g)) //[1,2,3]

replace

替换所有与正则表达式匹配的项,返回替换后的字符串,第二个参数可带回调(配合分组操作)

1
2
var str = "Visit Microsoft!"
console.log(str.replace(/Microsoft/, "myblog")); //Visit myblog!

几个核心转义

|: 条件或

点 .:任意字符

\w: 字符 ( 字母、数字、下划线 )

\W: 非字符

\d: 数字

\D: 非数字

\s: 空格

\S: 非空格

\b: 单词边界(起始、结束或空格)

\B: 非单词边界

\1: 重复的第一项,\2 一次类推

^a:开头为字符a

a$ :结尾为字符a
其他如要表示真实的点 . ,加号 +,小括号 ( ),中括号 [ ] 等等均需加 \ 转义

正则中的小括号 ( )

进行匹配子项的分组操作,量词作用于前一个小括号

1
2
3
4
5
6
7
8
9
10
var str = '1995-11-02-1-12138-4399'
var re = /\d-/g //5-,1-,2-,1-,8-
var re1 = /\d+-/g //1995-,11-,02-,12138-
var re3 = /(\d-)+/g //2-1-
str.replace(re, ($0, $1, $2)=> {
return change($0)
//$0:每次匹配成功的字符串
//$1:每次匹配成功的字符串中对应正则第一个子项的内容
//$2:每次匹配成功的字符串中对应正则第二个子项的内容
})

正则中的中括号 [ ]

中括号表示一个字符类(所匹配字符的范围)去匹配一个字符,^ 在中括号内表排除

Item Value
[abc] 查找方括号之间的任何字符
[^abc] 查找任何不在方括号之间的字符
[0-9] 查找任何从 0 至 9 的数字
[a-z] 查找任何从小写 a 到小写 z 的字符
[A-Z] 查找任何从大写 A 到大写 Z 的字符
[0-9a-zA-Z] 查找范围为0-9,a-z,A-Z

正则中的大括号(量词)

{num1 , num2}: 最少num1次,最多num2次

{num1 , }: 最少num1次

{ num }: 正好num次

+: 最少1次

: 1次或0次

星号: 任意次(包括0)

重复的子项

1
2
3
4
5
6
7
8
9
10
11
12
13
var str = 'wqerereeererrerwqrerewq'
var str1 = str.split('').sort().join('')
var re = /(\w)\1+/g
var len = 0
var char = null
str1.replace(str1, function($0, $1){
if(len< $0.length){
len = $0.length
char = $1
}
})
//char: str中出现次数最多的字母
//len: 最多出现了多少次

相关粒子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// QQ号、手机号、Email、是否是数字、去掉前后空格、是否存在中文、邮编、身份证、URL、日期格式、IP
var myRegExp = {
// 检查字符串是否为合法QQ号码
isQQ: function(str) {
// 1 首位不能是0 ^[1-9]
// 2 必须是 [5, 11] 位的数字 \d{4, 9}
var reg = /^[1-9][0-9]{4,9}$/gim;
if (reg.test(str)) {
console.log('QQ号码格式输入正确');
return true;
} else {
console.log('请输入正确格式的QQ号码');
return false;
}
},
// 检查字符串是否为合法手机号码
isPhone: function(str) {
var reg = /^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57]|17[678])[0-9]{8}$/;
if (reg.test(str)) {
console.log('手机号码格式输入正确');
return true;
} else {
console.log('请输入正确格式的手机号码');
return false;
}
},
// 检查字符串是否为合法Email地址
isEmail: function(str) {
var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
// var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
if (reg.test(str)) {
console.log('Email格式输入正确');
return true;
} else {
console.log('请输入正确格式的Email');
return false;
}
},
// 检查字符串是否是数字
isNumber: function(str) {
var reg = /^\d+$/;
if (reg.test(str)) {
console.log(str + '是数字');
return true;
} else {
console.log(str + '不是数字');
return false;
}
},
// 去掉前后空格
trim: function(str) {
var reg = /^\s+|\s+$/g;
return str.replace(reg, '');
},
// 检查字符串是否存在中文
isChinese: function(str) {
var reg = /[\u4e00-\u9fa5]/gm;
if (reg.test(str)) {
console.log(str + ' 中存在中文');
return true;
} else {
console.log(str + ' 中不存在中文');
return false;
}
},
// 检查字符串是否为合法邮政编码
isPostcode: function(str) {
// 起始数字不能为0,然后是5个数字 [1-9]\d{5}
var reg = /^[1-9]\d{5}$/g;
// var reg = /^[1-9]\d{5}(?!\d)$/;
if (reg.test(str)) {
console.log(str + ' 是合法的邮编格式');
return true;
} else {
console.log(str + ' 是不合法的邮编格式');
return false;
}
},
// 检查字符串是否为合法身份证号码
isIDcard: function(str) {
var reg = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
if (reg.test(str)) {
console.log(str + ' 是合法的身份证号码');
return true;
} else {
console.log(str + ' 是不合法的身份证号码');
return false;
}
},
// 检查字符串是否为合法URL
isURL: function(str) {
var reg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i;
if (reg.test(str)) {
console.log(str + ' 是合法的URL');
return true;
} else {
console.log(str + ' 是不合法的URL');
return false;
}
},
// 检查字符串是否为合法日期格式 yyyy-mm-dd
isDate: function(str) {
var reg = /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/;
if (reg.test(str)) {
console.log(str + ' 是合法的日期格式');
return true;
} else {
console.log(str + ' 是不合法的日期格式,yyyy-mm-dd');
return false;
}
},
// 检查字符串是否为合法IP地址
isIP: function(str) {
// 1.1.1.1 四段 [0 , 255]
// 第一段不能为0
// 每个段不能以0开头
//
// 本机IP: 58.50.120.18 湖北省荆州市 电信
var reg = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/gi;
if (reg.test(str)) {
console.log(str + ' 是合法的IP地址');
return true;
} else {
console.log(str + ' 是不合法的IP地址');
return false;
}
}
}
// 测试
// console.log(myRegExp.isQQ('80583600'));
// console.log(myRegExp.isPhone('17607160722'));
// console.log(myRegExp.isEmail('80583600@qq.com'));
// console.log(myRegExp.isNumber('100a'));
// console.log(myRegExp.trim(' 100 '));
// console.log(myRegExp.isChinese('baixiaoming'));
// console.log(myRegExp.isChinese('小明'));
// console.log(myRegExp.isPostcode('412345'));
// console.log(myRegExp.isIDcard('42091119940927001X'));
// console.log(myRegExp.isURL('https://www.baidu.com/'));
// console.log(myRegExp.isDate('2017-4-4'));
// console.log(myRegExp.isIP('1.0.0.0'));