正则表达式
概述
概念
- 对字符串操作的一种逻辑公式
- 用事先定义好的一些特殊字符、及这些特定字符的组合,组成一个”规律字符串“,用来表达对字符串的一种过滤逻辑
作用
- 给定的字符串是否符合正则表达式的过滤逻辑(匹配)
- 通过正则表达式,从字符串中获取我们想要的特定部分(提取)
- 强大的字符串替换能力(替换)
创建方法
-
使用正则表达式字面量创建(最为常用)
var reg = /abc/;
-
调用RegExp对象的构造函数
var reg1 = new RegExp("abc");
字符串方法
-
split
-
分隔字符串,成为一个数组
var str = "aa bbb c dd eeeee"; var arr = str.split(" "); //(8) ["aa", "bbb", "", "", "", "c", "dd", "eeeee"] var arr = str.split(/\s+/); //(5) ["aa", "bbb", "c", "dd", "eeeee"]
-
-
search
-
寻找匹配字符串在父字符串中位置,返回第一次出现的下标值
var str = "abcdef"; console.log(str.search(/de/)); //3 console.log(str.search(/ed/)); //-1
-
-
match
-
在父字符串中寻找匹配字符串,将结果输出到数组中
var str = "abbcccbbbbbddbbbdabbb"; var arr1 = str.match(/b+/); //匹配到第一个后就结束bb var arr2 = str.match(/b+/g); //["bb", "bbbbb", "bbb", "bbb"]在全局下查找添加g
-
-
replace
-
替换父字符串中匹配字符串,原字符串不会改变
var htl = "www.hello.com" console.log(htl.replace(/hello/, "nice-to-meet-u")); //www.nice-to-meet-u.com
-
正则方法
-
exec
-
查找匹配的字符串输出到数组中,不论有没有全局修饰符,都只会在找到第一个之后停止
var str = "aaabcccbacabc"; var arr = /abc/.exec(str); console.log(arr); //["abc", index: 2, input: "aaabcccbacabc", groups: undefined] console.log(arr.index); //可以打点调用数组的具体值
-
-
test
-
检测字符串中是否满足正则表达式的匹配规则,返回值是一个布尔值
console.log(/abc/.test("aaabcccbacabc")); //true
-
-
组成
- 由一些普通字符和一些特殊字符(元字符)组成,普通字符包括大小写的字母和字符,元字符具有特殊的含义
- 常用特殊字符:()、[]、{}、\、^、$、|、?、*、+,需要通过\进行转义
- 预定义特殊字符:\t制表符空格 \n回车符 \b空格
字符
字符集
-
使用[]表示的可能的字符的集合,集合内部可以排列多个匹配字符串的可能性,整个字符集需要匹配的是字符串中的一个字符
-
简单类:[]多个可能匹配的字符连续书写在一起,只要其中一个匹配成功即可
console.log(/[abc]/.test("eeeec")); //true
-
**范围类:**有时匹配的东西过多,类型又相同,可以中间加一个横线
console.log(/[a-z]/.test("01234")); //false
-
负向类:[]前面加一个元字符进行取反,表示匹配不能是括号中字符
console.log(/[^a-z]/.test("g987")); //true,单独出现
-
**组合类:**允许用中括号匹配不同类型的单个字符,如果是数字、大写字母、小写字母的顺序组合就可以进行缩小
console.log(/[0-5 a-e]/.test("z98")); //false
修饰符
-
g修饰符用于执行全局匹配,查找到所有匹配而非在找到第一个匹配后停止
var str = "aabblsdddbbbdlBBdllbbbbb"; var arr1 = str.match(/b+/); //["bb"] var arr2 = str.match(/b+/g); //(3) ["bb", "bbb", "bbbbb"]
-
i修饰符用于执行对大小写不敏感的匹配
var arr3 = str.match(/b+/gi); //(4) ["bb", "bbb", "BB", "bbbbb"]
边界
-
^开头,表示正则表达式必须以后面的内容限制开头
console.log(/^hello/.test("hello js")); //true console.log(/^hello/.test("js hello")); //false
-
$结尾,表示正则表达式内容必须以限制内容结尾
console.log(/js$/.test("hello js")); //true console.log(/js$/.test("js hello")); //false
-
实际应用中我们会同时限制开头和结尾
console.log(/^hello\s+js$/.test("hello js")); //true
预定义类
-
其实是字符集的简介写法
console.log(/^.+$/.test(`dajsdo `)); //false,只要不是回车换行即为真 console.log(/^\d+$/.test(`123456`)); //true数字字符 console.log(/^\d+$/.test(`123a456`)); //false console.log(/^\D+$/.test(`abcdef`)); //true非数字字符 console.log(/^\D+$/.test(`abc123`)); //false console.log(/^\s+$/.test(` `)); //true空白字符 console.log(/^\S+$/.test(`asfg`)); //true非空白字符 console.log(/^\S+$/.test(` `)); //false console.log(/^\w+$/.test("az15_")); //true单词字符 console.log(/^\W+$/.test("%$#^")); //true非单词字符
量词
-
{n}硬性量词,没有弹性,对应前面的内容必须在字符串中出现n次
var reg = /^\d{5}$/; console.log(reg.test("1234")); //false console.log(reg.test("12345")); //true console.log(reg.test("123456")); //false
-
{n,m}软性量词,至少出现n次但不能超过m次{n,}至少出现n次+
var reg = /^\d{2,5}$/; console.log(reg.test("1234")); //true console.log(reg.test("12345")); //true var reg2 = /^\d{3,}$/; console.log(reg2.test("12")); //false console.log(reg2.test("12345")); //true
-
软性量词 ?出现0/1; *出现0/多次; +至少出现一次
var reg3 = /^\d?$/; var reg4 = /^\d*$/; var reg5 = /^\d+$/; console.log(reg3.test("")); //true零或一 console.log(reg3.test("")); //true零或多 console.log(reg.test("")); //false一多以上
分组
-
概念
用中括号表示范围内选择,大括号表示重复次数,小括号进行包裹
console.log(/^(bye){2}$/.test("byebye")); //true console.log(/^(bye){2}$/.test("bbyyee")); //false
-
或操作符
console.log(/^a|bye$/.test("byebye")); //true,满足以a开头或者以bye结尾的 // 如果想在正则中,在两个规则之间只能选择一个,不能包含其他的开头结尾,需要去加到运算分组中 console.log(/^(ab|cd)$/.test("ab")); //true console.log(/^(ab|cd)$/.test("abcd")); //false
-
反向引用
对正则表达式中的匹配组捕获的子字符串进行编号
-
通过"\编号(在表达式中)
console.log(/^([a-z]{3})\1$/.test("byebye")); //true console.log(/^([a-z]{3})\1$/.test("byelie")); //false
-
“$编号(在表达式外)”进行引用
var str = "123*456".replace(/^(\d{3})\*(\d{3})$/, "$2*$1"); console.log(str); //456*123 //replace函数可以进行传入函数,第一个参数必须是match var str = "123*456".replace(/^(\d{3})\*(\d{3})$/, function(match, $1, $2) { return $1 * 3 + "/" + $2 * 2 //会自己转化为数字 }); console.log(str); //369*912
-
中文匹配
-
匹配中文
var reg = /^[\u4e00-\u99fa5]+$/; console.log(reg.test("只有中文内容")); //true console.log(reg.test("有 空格")); //false