| 2 min read

背景,最近需要匹配出某段脚本里的字符串比如:

<script type="text/javascript">window._debug = false</script>

从中截取 到下面内容:

window._debug = false

第一时间想到了 .* 来进行中间的匹配:

/<script .+>(.*)<\/script>/

但是实际情况是,大多数脚本和测试的是不一样,都是多行的,会存在换行符。

<script type="text/javascript">
  window._debug = false
  window._obj = {
    a: 1,
    b: 2
  }
</script>

这个时候你可以使用取反的字符匹配类似来避免:

var reg = /[\w\W]*/ // [\s\S] [\d\D] 等

那么差不多这样就可以了。

除此之外,还有一个在 JS 行的通的方案就是 [^]* 的方案。

我们写一段脚本来试验下匹配效率:

var regs = [
  /<script .+>([\s\S]*)<\/script>/,
  /<script .+>([\w\W]*)<\/script>/,
  /<script .+>([^]*)<\/script>/,
  /<script .+>((?s).*)<\/script>/
] 

var s = `<script type="text/javascript">
  window._debug = false
  window._obj = {
    a: 1,
    b: 2
  }
</script>`
function test(reg) {
  var start = window.performance.now()
  for (var i = 0; i < 10000; i++) {
    var matchs = s.match(reg)
  }
  console.log(reg.toString(), ':' + (window.performance.now() - start))
}
for(var i = 0; i < regs.length; i++ ) {
  test(regs[i])
}


大概结果是:

平均下来 第三种会相对更快一点,其实日常生活中,用任意一种其实都是无感知的,但是这里做个测试,也希望有正则表达式的大神,能给出一点思路解答疑惑?

You Can Speak "Hi" to Me in Those Ways