什么是正则表达式
- 正则表达式:用于匹配规律的表达式,正则表达式最初是科学家对人类神经系统的工作原理的早起研究,现在在编程语言中有广泛的应用。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
- 正则表达式是对字符串操作的一种逻辑公式,就是用事先定好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式的作用
1 给定的字符串是否符合正则表达式的过滤逻辑(匹配)
2 可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)
3 强大的字符串替换能力(替换)
语法
- 在 JavaScript 中,正则表达式也是对象,是一种索引类型
- 使用一个正则表达式字面量是最简单的方式。两个/是正则表达式的定届符。
- 你可以通过下面两种方法创建一个正则表达式:
- 使用一个增则表达式字面量,如图所示:
var reg = /abc/;
正则表达式字面量在脚本加载后编译。若你的正则表达式是常量,使用这种方式可以获得更好的性能。 - 调用 RegExp 对象的构造函数,如下所示:
var re = new RegExp("abc");
字符串方法
split
- 分割字符串,成为一个数组
var str = "aa bbb c dd eeeee";
var arr = str.split(" ");
console.log(arr);
// 使用正则可以进行模糊匹配分割
// var arr1 = str.split(/\s+/);
search
- 寻找匹配字符串在父字符串中位置
var str = "abcdefg";
console.log(str.search("cd"));
// 使用正则
console.log(str.search(/eff/))
match
- 在父字符串中寻找匹配字符串
var str = "abbcccbbbbbddbbbdabbb";
var arr = str.match(/b+/);
console.log(arr);
// Array(1)
// 0: "bb"
// groups: undefined
// index: 1
// input: "abbcccbbbbbddbbbdabbb"
// length: 1
// [[Prototype]]: Array(0)
var str = "abbcccbbbbbddbbbdabbb";
var arr = str.match(/b+/g); // 如果有全局修饰符 会在找到所有匹配的字符串后结束
console.log(arr);
replace
- 替换父字符串中匹配字符串
var str = "www.hello.com";
var str1 = str.replace(/hello/,"hhhh");
console.log(str1);
RegExp: exec
- 在字符串中寻找匹配字符串,该方法比其他正则方法或字符串方法支持的更复杂
var str = "aaaabccccbacabc";
var reg = /abc/;
var arr = reg.exec(str);
console.log(arr);
RegExp: test
- 检测字符串是否匹配正则表达式
var reg = /abc/;
console.log(reg.test(aaaaaabcaaaa));
正则表达式组成
-
由一些普通字符和一些特殊字符(又叫元字符--metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。
特殊字符:JavaScript 中常用特殊字符有 () [] {} \ ^ $ | ? * + .
若想匹配这类字符必须用转移符号 \ 如:(,^,\
var reg = /abc/;
// 表示正则匹配是,需要进行精确匹配,必须包含 abc ,并且顺序不能颠倒,而且要连续书写
console.log(reg.test("asbsbjaksbkjdbjk"));
// 特殊字符,匹配字符串中对应的普通的符号字符时,需要进行转移
var reg1 = /\*/;
console.log(reg1.test("*usjkajdkjhak"));
// 预定义特殊字符
// 一些特殊的字符串不能在正则中直接书写相同的符号,所以正则中提供了一些替换写法
var reg2 = /\t/;
console.log(reg2.test(" "));
字符集
简单类:正则的多个字符对应一个字符,我们可以用[]把它们括起来,让[]这个整体对应一个字符[abc]
eg:o[usb]t——obt、ost、out
范围类:有时匹配的东西过多,而且类型又相同,全部输入太麻烦,我们可以在中间加了一个横线。[a-z]、[0-9]、[A-Z]
eg: id[0-9]——id0、id5
负向类:[]前面加个元字符进行取反,表示匹配不能为括号里面的字符。[^a]
eg: o[^0-9]t——oat、o?t、o t
组合类:允许用中括号匹配不同类型的单个字符。[0-9a-b]
eg:o[0-9a-b]t——oat、o?t、o
修饰符
g 修饰符用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
i 修饰符用于执行对大小写不敏感的匹配
边界
^ 表示限制开头 注意不能紧跟于左中括号的后面
/^hello/.test('hello javascript') => true
/^javascript/.test('hello javascript') => true
& 结尾
/javascript/.test('hello javascript') => false
预定义类
量词
分组
虽然量词的出现,能帮助我们处理一排紧密相连的同类型字符。但这是不够的,我们用中括号表示范围内的选择,大括号表示重复次数。如果想获得重复多个字符,我们就要用小括号进行分组了
/(bye){2}/.test('byebye') => true
/(bye){2}/.test('bye') => false
或操作符
可以使用竖线 | 字符表示或者的关系
/a|bcd/ 匹配a或bcd字符
/(ab)+|(cd)+/ 匹配出现一次或多次的ab或者cd
var reg = /^a|bcd$/; // 匹配时,要么匹配以a开头的,要么匹配以bcd结尾的
// 如果想在正则中,在两个规则之间只能选其中一个,不能包含其他的开头结尾,需要去讲或运算放到分组里
var reg1 = /^(ab|cd)$/
分组的反向引用
反向引用标识是对正则表达式中的匹配组捕获的子字符串进行编号,通过“\编号(在表达式中)”,“$编号(在表达式外)”进行引用。从1开始计数。
中文匹配
匹配中文:[\u4e00-\u9fa5]
/[\u4e00-\u9fa5]+/.test('中文内容')
=》true
/[\u4e00-\u9fa5]+/.test('aaa')
=》false