为什么JavaScript RegExp.test()方法的行为是切换?

为什么JavaScript RegExp.test()方法的行为是切换?,javascript,regex,Javascript,Regex,有人能解释一下为什么下面JavaScript代码中的alert()会触发吗?它似乎是RegExp.test()方法中的一个bug,每次运行该方法时,它都会反转以前的决定。我用的是IE7 我找到了一个看起来很可靠的替换项,使用string.search(regex)方法代替。但是,我很好奇是否有人知道这件事 var styleHasWidthRegex = /\bwidth\s*\:/ig; var styleText = "WIDTH: 350px"; var result1 = s

有人能解释一下为什么下面JavaScript代码中的
alert()
会触发吗?它似乎是
RegExp.test()
方法中的一个bug,每次运行该方法时,它都会反转以前的决定。我用的是IE7

我找到了一个看起来很可靠的替换项,使用
string.search(regex)
方法代替。但是,我很好奇是否有人知道这件事

  var styleHasWidthRegex = /\bwidth\s*\:/ig;
  var styleText = "WIDTH: 350px";
  var result1 = styleHasWidthRegex.test(styleText);
  var result2 = !styleHasWidthRegex.test(styleText);
  if (result1 == result2) {
    alert("This should never happen!");
  }
您的正则表达式设置了全局(
g
)标志。每次执行它时,它都会更新一个内部索引(属性),指定它停止的位置,并在下一次执行时从该点开始搜索

当然,你并不是真的想要这样——你希望每次都从一开始就开始。因此,抛弃
g
标志


另请参见:在这个场景中,您无论如何都应该需要一个全局标记,因为在css声明中,属性只应该声明一次。

谢谢您的理解。非常有趣。我不知道,没问题,约翰。我第一次看到它也花了一段时间才拿到它!。。。。你真棒!今天就学习一些新东西:Dcame在这里更新投票。谢谢