正则表达式 - 匹配字符串不在另一个字符串之前(JavaScript)

时间:2013-09-18 23:57:36

标签: javascript regex

我正在尝试找到一个正则表达式,当它不在另一个特定字符串之前时会匹配一个字符串(在我的情况下,当它不在“http://”之前)时。这是在 JavaScript 中,我在Chrome上运行(不是它应该重要)。

示例代码为:

var str = 'http://www.stackoverflow.com www.stackoverflow.com';
alert(str.replace(new RegExp('SOMETHING','g'),'rocks'));

我想用正则表达式替换SOMETHING,这意味着“匹配www.stackoverflow.com,除非它之前是http://”。然后警报应该自然地说“http://www.stackoverflow.com岩石”。

有人可以帮忙吗?感觉就像我尝试了以前的答案中找到的一切,但没有任何作用。谢谢!

2 个答案:

答案 0 :(得分:4)

由于JavaScript正则表达式引擎不支持' lookbehind'断言,它不可能与普通的正则表达式有关。不过,还有一个解决方法,涉及replace回调函数:

var str = "As http://JavaScript regex engines don't support `lookbehind`, it's not possible to do with plain regex. Still, there's a workaround";

var adjusted = str.replace(/\S+/g, function(match) {
  return match.slice(0, 7) === 'http://'
    ? match
    : 'rocks'
});
console.log(adjusted);

您实际上可以为这些功能创建一个生成器:

var replaceIfNotPrecededBy = function(notPrecededBy, replacement) {
   return function(match) {
     return match.slice(0, notPrecededBy.length) === notPrecededBy
       ? match
       : replacement;
   }
};

...然后在replace中使用它:

var adjusted = str.replace(/\S+/g, replaceIfNotPrecededBy('http://', 'rocks'));

JS Fiddle

答案 1 :(得分:0)

这也有效:

var variable = 'http://www.example.com www.example.com';
alert(variable.replace(new RegExp('([^(http:\/\/)|(https:\/\/)])(www.example.com)','g'),'$1rocks'));

警报说“http://www.example.com岩石”。