创建
//1、使用字面量来创建表达式
// 语法:var 变量 = /正则表达式/匹配模式
//2、使用构造函数创建
// 语法:var reg = new RegExp("a", "i")
元字符
就是拥有特动功能的特殊字符,大部分需要加反斜杠进行标识,以便于普通字符进行区别,而少数元字符,需要加反斜杠,以便转译为普通字符使用。
匹配模式
g:全局匹配.
I:忽略大小写.
边界量词
字符类
描述字符范围
(): 括号表示字符范围。
[]: 方括号中可以包含多个字符,表示匹配其中任意一个字符。
如果多个. 字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符.
选择匹配
| : 表示或者
用竖线:"|"表示在两个子模式的匹配结果中任选一个。
var r = /\w+|\d+/; //匹配任意数字或字母
// []里的内容也是“或”的关系.
// [ab] == a|b
常用:
[abc]:查找方括号内任意一个字符。[或匹配a或者b或者c]
[a-c]: [abc]相同的含义.
[^abc]:查找不在方括号内的字符。
[^0-9]:查找非数字.
[0-9]:查找从0至9范围内的数字,即[查找数字]。
[a-z]:查从 a 到 z 范围内的字符,[查小写字母]。
[A-Z]:查从 A 到Z 范围内的字符,即[查大写字母]。
[A-z]:查从A到z范围内的字符,即[所有大小写的字母]。
[a-zA-Z0-9]:匹配任意大小写字母和数字:
//匹配字符串中是否含abc,adc,aec
var reg = /a[bde]c/;
// [^] 除了.
var reg = /[^ab]/;//匹配字符串中除了a,b,ab
console.log(reg.test("ab")); // false
console.log(reg.test("abc")); // true
// [ab] == a|b
限定符 [即量词]
重复匹配:定义了重复匹配字符的确数或约数。
通过量词可以设置一个内容出现的次数
量词只对它前边的一个内容起作用
a+ :a出现1次或多次,[1及以上,相当{1,} ]
a* :a出现0次或多次
a? :a出现0次或1次
a{6} :a出现6次
a{2,6} :a出现2~6次
a{2,} :a出现2次以上
let reg = /a{3}/
console.log(reg.test("abbbbc")); // false
reg = /(ab){3}/
console.log(reg.test("abbbbc")); // false
console.log(reg.test("abababbc"));// true
惰性匹配
重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符。
?、{n} 和 {n,m} 重复类具有弱贪婪性,表现为贪婪的有限性。
*、+ 和 {n,} 重复类具有强贪婪性,表现为贪婪的无限性。
针对 6 种重复类惰性匹配的简单描述如下:
{n,m}?:尽量匹配 n 次,但是为了满足限定条件也可能最多重复 m 次。
{n}?:尽量匹配 n 次。
{n,}?:尽量匹配 n 次,但是为了满足限定条件也可能匹配任意次。
??:尽量匹配,但是为了满足限定条件也可能最多匹配 1 次,相当于 {0,1}?。
+?:尽量匹配 1 次,但是为了满足限定条件也可能匹配任意次,相当于 {1,}?。
*? :尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于 {0,}?。
例如:
//下面代码演示如何使用边界量词。先定义字符串:
var s = "how are you"
//1) 匹配最后一个单词
var r = /\w+$/;
var a = s.match(r); //返回数组["you"]
//2) 匹配第一个单词
var r = /^\w+/;
var a = s.match(r); //返回数组["how"]
//3) 匹配每一个单词
//纯文本复制
var r = /\w+/g;
var a = s.match(r); //返回数组["how","are","you"]
字符串和正则配合的函数
//split字符串拆分返回一个数组
//根据任意字母来将字符串拆分
//不指定全局匹配也会全部拆分
let str = "1a2n3c4d";
let result = str.split(/[A-z]/);
console.log(result);// ['1', '2', '3', '4', '']
// search() :搜索字符串是否含有指定内容
// 搜到匹配内容则返回第一次出现的索引,没有就返-1;
//只会查找第一个,及时设置全局匹配也没有用
let str = "Hello abc hello aec afc";
let result = str.search(/a[bef]c/);
console.log(result); // 6
// match() :从一个字符串中将符合条件的内容取出来
// 默认只会找到第一个匹配内容,找到就停止检索;
// 可以设置全局匹配模式查找所有内容
let str = "1a2n3c4d5A6F7H";
let result = str.match(/[A-z]/g);
console.log(result); // ['a', 'n', 'c', 'd', 'A', 'F', 'H']
result = str.match(/[a-z]/gi);
console.log(result); // ['a', 'n', 'c', 'd', 'A', 'F', 'H']
// replace(oldStr,newStr) :将字符串中指定内容替换为新内容
// 默认只会替换第一个;
let str = "1a2n3c4d5A6F7H";
let result = str.replace(/a/gi,"@_@");
console.log(result); // 1@_@2n3c4d5@_@6F7H
常见的正则表达式:
1、国内手机号
//1、国内手机号都是1开头
//2、开头一般是:13,14,15,17,18,所以第二个数字是3,4,5,7,8,用中括号就可以限制用哪些字符
//3、接下来都是0——9的数字,打括号表示重复的次数
var r = /^1[34578]\d{9}$/;
console.log(r.test("18819302751"));//输出 true
2、Email
//1、邮箱开头包含所有大小写字母,数字和_-.这三个字符 ,-表中括号内的范围,.这个字符在正则表示任意字符,要用\来转义,,所以结果:A-Za-z0-9_\-\.
//2、A-Za-z]{2,4}表示.com 或.cn 2~4个字母组成
var r = /^([A-Za-z0-9_\-\.])+@([A-Za-z0-9_\-.])+.([A-Za-z]{2,4})$/;
console.log(r.test("99154507@qq.com"));//输出 true
3、QQ号
//1、第一个数字是1~9,[]选定指定的数字,也可在[]内用—来表示数字范围, =>/^[1-9]/
//2、第二个后是0~9数字,QQ最多5位,最少10位数,只取4~9个=>/[0-9]{4,9}$/
var s = "1271024201"
var r = /^[1-9][0-9]{4,9}$/;
var a = s.match(r);
4、去除空格
参看资料:
常见正则表达式
regexp对象
RegExp 对象参考手册