ribbon image search rewind fast-forward speech-bubble pie-graph star

JS 中匹配任意字符方案

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

<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