一、初识正则表达式
类似于对象、数组,正则表达式也有表达式写法和构造函数写法两种
var re = /a/ // 需要注意的是,这里'//'之间必须得有内容,否则会当做注释 var re = new RegExp('a')以上两种写法是等价的。
二、test
test方法用来判断字符串中是否能匹配到正则设定的内容,如果能匹配则返回true,否则返回false
语法:正则.test(字符串)
var str = 'ytuhayij68' var re = /a/ console.log(re.test(str)) // true三、search
search方法用来查找字符串中是否含有正则规定的内容,如果有则返回索引,否则返回-1
语法:字符串.search(正则)
var str = 'ytuhayij68' var re = /a/ console.log(str.search(re)) // 4四、match
match方法用来查找字符串中匹配正则规定的内容,如果能匹配则返回数组,数组中包含匹配到的项,否则返回null
语法:字符串.match(正则)
var str = 'ytuhayij6a8'
var re = /a/
console.log(str.match(re)) // ["a", index: 4, input: "ytuhayij68", groups: undefined]这里可以看到,我们最终的结果只返回了一个匹配的结果,正则默认第一次匹配成功则结束。如果我们想要在字符串中查找所有符合条件的项,那么需要在正则的后面加上g,代表全局匹配
var str = 'ytuhayiaj68' var re = /a/g console.log(str.match(re)) // ["a", "a"]五、replace
replace方法用来查找字符串中匹配的内容,然后替换,返回新的字符串
语法:字符串.replace(正则,新字符串)或者字符串.replace(正则,回调函数)
var str = 'ytuhayiaj68' var re = /a/g console.log(str.replace(re, '*')) // ytuh*yi*j68当使用回调函数时,回调函数中可以接受参数,第一个参数代表匹配到的值
var str = 'ytuhayiaj68' var re = /ha/g str.replace(re, function (str) { console.log(str) // ha })这里有一个知识点需要注意,回调函数中从第二个参数开始接收的是正则的子项。
例如:var re = /(h)(a)(y)/g
这里把(h)(a)(y)称作母项,h为第一个子项,a为第二个子项,y为第三个子项,依次类推。
一般第一个子项用$1表示,之后类推。
var str = 'ytuhayiaj68' var re = /(h)(a)(y)/g str.replace(re, function ($0, $1) { console.log($0) // hay console.log($1) // h })六、转义字符
正则中常用到的转义字符
\s:空格
\S:非空格
\d:数字
\D:非数字
\w:字符(字母、数字、下划线)
\W:非字符
\b:单词边界
\B:非单词边界
\1:重复第一个子项
\2:重复第二个子项
. :代表任意字符(这个比较特殊)
七、量词
我们使用正则匹配时,可能需要以下场景,某个字符可以匹配,也可以不匹配,某个项需要匹配一定的次数,那么这时就需要用到量词了,正则中的常用量词如下:
{4,7}:大于等于4次小于等于7次
{4,}:大于等于4次
{4}:等于4次
?:0次或1次 === {0,1}
+: 大于等于1次 === {1,}
*:大于等于0次 === {0,}
八、位置匹配
^:脱字符,匹配开头,在多行匹配中匹配行开头
$:美元符号,匹配结尾,在多行匹配中匹配行结尾
\b:是单词边界,具体就是\w和\W之间的位置,也包括\w和^之间的位置,也包括\w和$之间的位置
\B:是\b的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉\b,剩下的都是\B的。
(?=p):其中p是一个子模式,即p前面的位置
(?!p):就是(?=p)的反面意思
1.把字符串的开头和结尾用'#'替换
var result = "hello".replace(/^|$/g,'#')console.log(result) // #hello#var result = 'I\nlove\nyou'.replace(/^|$/gm, '#')console.log(result) /** * #I# * #love# * #you# */多行匹配时,二者是行的概念。
2.在字符l的前面添加'#'
var result = 'hello'.replace(/(?=l)/g,'#') console.log(result) // he#l#lo3.在除了l前面的位置添加'#'
var result = 'hello'.replace(/(?!l)/g,'#') console.log(result) // #h#ell#o#4.数字的千位分隔符表示法
var result = '2345567886756434'.replace(/(?!^)(?=(\d{3})+$)/g,',')console.log(result) // 2,345,567,886,756,434九、一些正则的小例 子
1.去掉某个字符串的收尾空格
var str = ' ytuhayiaj68 ' var re = /\b\s+|\s+\b/g var newStr = str.replace(re, '') console.log('(' + newStr + ')') // (ytuhayiaj68)这里用到了\b,表示这个字符串的边界。
或
var str = ' ytuhayiaj68 ' var re = /(^\s+)|(\s+$)/g var newStr = str.replace(re, '') console.log('(' + newStr + ')') // (ytuhayiaj68)注意:第二种写法中有用到^和$这两个字符,其中^写在正则的前面表示字符串起始位置,$写在正则的后面表示字符串的结束位置。
2.找到页面中对应的class为box1的项,将之背景变更为红色
<ul> <li class="box1"></li> <li></li> <li class="box1box2"></li> <li></li> <li class="box1 box2"></li> </ul> <script> var liList = document.getElementsByTagName('li') function changeBg(listNode, classItem) { var re = new RegExp('\\b' + classItem + '\\b') for (var i = 0; i < listNode.length; i++) { if (re.test(listNode[i].className)) { listNode[i].style.background = 'red' } } } changeBg(liList, 'box1') </script>这里需要注意两点,一个是如果正则中需要用变量的话,那么必须用构造函数的方式来构造正则传参。一个是添加\b时需要在前面加\,这样才能将\b传入正则中
3.关键字屏蔽,将字符串中的“导游”和“游客”都替换成“**”
var str = '责成涉事导游员赵某某向游客赔礼道歉,对涉事导游员赵某某作出吊销导游证的行政处罚' var re = /导游|游客/g var newStr = str.replace(re, function ($0, $1) { var result = '' for (var i = 0; i < $0.length; i++) { result += '*' } return result }) console.log(newStr) // 责成涉事**员赵某某向**赔礼道歉,对涉事**员赵某某作出吊销**证的行政处罚4.去掉字符串中包含的标签,如<div><h3>等等
var str = '去掉<h3>字</h3>符串<div class="hello">中包</div>含的标签' var re = /<[^>]+>/g console.log(str.replace(re, '')) // 去掉字符串中包含的标签这里在中括号内部使用了^,[^>]这个整体代表着非>的字符
5.将一个字符串转化为驼峰方式,如:"get-element-by-id"
var str = 'get-element-by-id'var re = /-\w/gvar newStr = str.replace(re, function ($0) { return $0.slice(1).toUpperCase()})console.log(newStr) // getElementById6.匹配xxyy模式
var str = 'xxyy'var re = /(\w)\1(\w)\2/console.log(re.test(str)) // true