正则
1. 创建正则表达式
js
var re1 = new RegExp('abc') // 匹配字符串中包含"abc"
var re2 = new RegExp('abc', 'i') // 匹配字符串中包含"abc",不区分大小写
2. 匹配字符串
js
var str = 'abcdefg'
var re = /abc/
re.test(str) // 返回true
3. 获取括号的内容,包换括号
js
var str = '123{456}hhh[789]zzz[yyy]bbb(90ba)kkk'
var regex1 = /\((.+?)\)/g // () 小括号
var regex2 = /\[(.+?)\]/g // [] 中括号
var regex3 = /\{(.+?)\}/g // {} 花括号,大括号
// 输出是一个数组
console.log(str.match(regex1)) //['(90ba)']
console.log(str.match(regex2)) //['[789]', '[yyy]']
console.log(str.match(regex3)) //['{456}']
4. 获取括号的内容,不包含括号
js
var str2 = '123{456}hhh[789]zzz[yyy]bbb(90ba)kkk'
var regex11 = /(?<=\()(.+?)(?=\))/g // () 小括号
var regex22 = /(?<=\[)(.+?)(?=\])/g // [] 中括号
var regex33 = /(?<=\{)(.+?)(?=\})/g // {} 花括号,大括号
// 输出是一个数组
console.log(str2.match(regex11)) //['90ba']
console.log(str2.match(regex22)) //['789', 'yyy']
console.log(str2.match(regex33)) //['456']
正则中 lastIndex 引起的 Bug
js
var str = 'abcabcabc'
var re = /abc/g
re.test(str) // 返回true
re.lastIndex // 返回4
re.test(str) // 返回true
re.lastIndex // 返回8
re.test(str) // 返回true
re.lastIndex // 返回12
re.test(str) // 返回false
re.lastIndex // 返回0
解决方案
第一种
我们可以去除正则的全局匹配,因为只有全局匹配下这个 Bug 才会出现。
第二种
如果非要全局匹配的话,可以每次都去创建一个新的正则,新的正则就和之前的没有什么关系了,但是这样子就会出现效率问题,因为正则也是一个对象,如果不变的话还是提出去好。
javascript
input.oninput = function () {
// 每次都创建一个新的正则
const reg = /^1\d{10}$/g
if (reg.test(this.value)) {
msg.style.display = 'none'
} else {
msg.style.display = 'block'
}
}
第三种
就是每次重置 lastIndex 的值,每次赋值为 0,然后匹配的位置每次就都是从 0 开始了。
javascript
const reg = /^1\d{10}$/g
input.oninput = function () {
reg.lastIndex = 0
if (reg.test(this.value)) {
msg.style.display = 'none'
} else {
msg.style.display = 'block'
}
}