JavaScript负面观察

时间:2012-03-19 23:44:13

标签: javascript regex

我在这里看到了许多其他问题围绕JavaScript的负面观察,但我似乎无法模仿它们。我有以下正则表达式:

\b((?:http[s])?\S+\.\S+\.(?:\S+\.?){1,4})(?<!@)\b` 

这个正则表达式的基础是匹配网址,如:

  • www.msn.com
  • http://www.msn.com
  • https://www.google.com
  • http://msdn.microsoft.com

但是,它也匹配name@d1.d2.d3.d4,因为@符号后面有众多域名。我需要为@符号执行负面的lookbehind。

希望有人能帮助我!

更新

更新以包含我用于从匹配文本中创建超链接的替换字符串。

replace(webLinkPattern, "<a href=\"http://$2\" target=\"_blank\" onclick=\"preventDualEditing(event)\">$2</a>");

更新2 - 答案

ts = ts.replace(webLinkPattern, function (url) {
    if (url.indexOf('@') != -1) {
        return url;
    }

    return url.replace(webLinkPattern, "<a href=\"http://$&\" target=\"_blank\" onclick=\"preventDualEditing(event)\">$&</a>");
});

1 个答案:

答案 0 :(得分:2)

JavaScript不支持lookbehind断言,因此您必须在自己的代码中处理此问题。一种选择只是在结果中包含@,然后在@出现时放弃匹配:

replace(/(?:\b|@)(?:https?)?\S+\.\S+\.(?:\S+\.?){1,4}\b/,
        function(url) {
          if(url.indexOf('@') > -1)
            return url;
          return '<a href="' + url + ' target="_blank"' +
                 ' onclick="preventDualEditing(event)">' + url + '</a>';
        }
       );

或者,您可以检查回调中的前一个@,即使不将其包含在url中:

replace(/\b(?:https?)?\S+\.\S+\.(?:\S+\.?){1,4}\b/,
        function(url, pos, str) {
          if(pos > 0 && str.charAt(pos - 1) == '@')
            return url;
          return '<a href="' + url + ' target="_blank"' +
                 ' onclick="preventDualEditing(event)">' + url + '</a>';
        }
       );

(请注意,我已将http[s]更改为https?,这就是您的意思。http[s]https相同,因为[s]是一个匹配任何s字符的字符类。)