Skip to content
On this page

正则

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'
  }
}

上次更新于: