正则表达式
正则表达式主要用来验证客户端输入的数据
经典面试题(筛选字符)
定义方式
--使用//来定义(字面量形式) 一般情况下使用字面量的形式来定义
eg:
var reg = /\a+/g; (English为模式字符串,g为模式修饰符)
var str = "dhenfaaaajfeia";
console.log(reg.test(str )); //返回值true
--使用newRegExp()来定义 当模式字符串需要动态改变时,使用此方法定义。
/*对RegExp()函数进行构造调用
var a = /pig/g;
var reg = new RegExp(a,"ig");
(用RegExp的方式来创建正则表达式,第一个参数可以是字面量也可以是变量(a),第二个参数是模式修饰符(ig))
console.log(reg.exec("this is a pig"));
//返回值是数组---> ["pig", index: 10, input: "this is a pig", groups: undefined]
元字符
元字符:修饰字符的字符
--或(|)
匹配模式字符串中任意一组字符
eg:
this|where|go
匹配this,where,go中的任意一个
--单个字符( . \d \D \w \W [] [^])
. 匹配除换行符以外的任意字符
\d 匹配单个数字
\D 匹配单个非数字
\w 匹配字母,数字,_
\W 匹配非字母,非数字,非_
[] 匹配括号[]中字符集的任意字符
[^] 匹配不在括号[]中字符集的任意字符
--量词字符(* ?+ {m,n})
x* 匹配0个x或多个x
x? 匹配0个x或1个x
x+ 匹配1个x或多个x
x{m,n} 至少m个x,至多n个x
--锚点字符( ^ $)
匹配行首^ 匹配行尾$
eg:
^mn$
以m开头,以n结束
^ 在[]内表示非,在[]外表示行首
--空格(\s)
\s匹配空格字符,空格,换行符,制表符
--单词边界(\b)
\b匹配单词边界。此元字符有天坑--->\b匹配字符时,将满足\w(字母,数字,_)的也作为单词的边界
eg:
item-1 item-2 item-3
当使用\b去匹配item-1时,会将item-1拆分为两个独立的单词(item,-1)
--可重复的子项
\1($1) 匹配第一个分组的内容
\2($2) 匹配第二个分组的内容
\3($3) 匹配第三个分组的内容
-- 分组(())
强调括号内的字符是一个整体
eg:
var reg = /(ab)+/g;
var str = "ab ababcc chsbaab"
console.log(str.match(reg)); //返回值 ["ab", "abab", "ab"]
与正则相关的API
--与RegExp相关的API
RegExp_prototype_test()
返回值为布尔值
--RegExp_prototype_exec()
返回值是数组:
[匹配成功的子字符串,1号分组子字符串,2号分组...,匹配成功的子字符串第一次出现的索引,源字符串]
eg:
["pig", index: 10, input: "this is a pig"]
--与String相关的API
String_prototype_match()
String_prototype_match(正则表达式 模式修饰符)
匹配源字符串出现的模式字符串b(b也可以是变量) 此API使用正则时需要 开启全局g 返回值是数组
var str = "sbfjabccehdgabc";
console.log(str.match(/b/g)); //返回值["b","b","b"]
String_prototype_splite()
String_prototype_splite(模式字符串)
利用此API的第一个参数模式字符串将源字符串分割 返回值是分割后的数组
eg:面试题
(筛选出出现次数最多的字符) 代码见webstorm
String_prototype_replace()
String_prototype_replace(字符串/正则表达式,函数/字符串)
此API需要开启全局匹配g
函数 参数
第一个参数 匹配成功的子串
第二个参数 第一个分组的内容
第三个参数 第二个分组的内容
eg:面试题
webstorm中(过滤敏感词)
模式修饰符
i 忽略大小写
g 全局匹配(没有开启全局匹配,每次用整个源字符串去匹配正则;开启全局匹配,每次将匹配成功后剩下的源字符串去匹配正则)
m 多行匹配,只影响^与$
eg:
var reg = /^xxx/mg;
开启m:认为每一行从^开始
不开启m:认为只有第一行从^开始
正则的静态属性 (正则方法被调用时才有用)
$分别是它们的简写形式
input($_) 匹配源字符串
lastMacth($&) 最后一次匹配的子字符串
lastParen($+) 最后一次分组括号内匹配的子字符串
leftContext($`) 最后一次匹配的子字符串前面的子字符串
rightContext($') 最后一次匹配的子字符串后面的子字符串
$1 第一个分组的内容
$2 第二个分组的内容
eg:webstrom中正则的静态属性
正则的实例属性
global 是否开启全局
multiline 是否开启多行匹配
ignoreCase 是否忽略大小写
source (正则表达式的源字符串形式)==模式字符串
lastIndex
代表下次匹配的起始位置(索引位置)
(只有正则表达式开启了全局g,lastIndex的索引位置才会随着匹配的子字符串进行改变,否则lastIndex的索引位置永远从0开始)
规则:
1)如果lastIndex的索引位置大于或的等于源字符串的长度
reg.test() //返回值false
reg.exec() //返回值null
reg.laseIndex //索引位置置为0
2)如果lastIndex小于源字符串的长度,就进行lastIndex的正常语法进行匹配
reg.test() //返回值true
reg.exec() //返回值:匹配成功子字符串的数组
reg.lastInndex //紧接着匹配成功的子字符串的下一个位置
3)当匹配空白字符串{\s{0}}时(坑)
当lastIndex小于源字符串长度时
reg.test() //永远为true
reg.exec() //永远为""
reg.lastIndex //永远为0
最佳实践:
不要让模式字符串 匹配空白字符的正则
\s{0} \s* a* b* a{0}
贪婪,惰性
--贪婪:
先看看整个字符串是否存在匹配,如果未发现匹配,则去掉字符串中的最后一个字符,再次尝试匹配,如果还是未发现匹配再去掉最后一个字符,循环往复直到发现一个匹配或者字符串不剩任何字符串。
--惰性:
先看看字符串的第一个字母是否存在匹配,如果未发现匹配,则读入下一个字符,再次尝试匹配,如果还是未发现匹配则再读取下一个字符,循环往复直到发现一个匹配或者整个字符串都检查过也没有发现匹配。(第一次匹配成功就不会再向下匹配)
可重复的子项
\1 第一个分组的内容
eg:
var reg = /(\d)\1/
var str = "22";
var str2 ="23";
console.log(reg.test(str)) //返回值为true
console.log(reg.test(str2)); //返回值为false
注意点:\1的内容必须与第一个分组的内容一致(一模一样)
\2 第二个分组的内容
var reg = /(\d)\1(\w)\2/
var str = "22xx";
var str2 ="23xy";
console.log(reg.test(str)) //返回值为true
console.log(reg.test(str2)); //返回值为false
注意点:\2的内容必须与第二个分组的内容一致(一模一样)