【问题标题】:JavaScript Negative LookbehindJavaScript 负向回溯
【发布时间】:2012-03-19 23:44:13
【问题描述】:

我在这里查看了许多其他关于 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,因为@ 符号后面有许多域名。我需要对该 @ 符号执行否定的后视操作。

希望有人能帮帮我!

更新

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

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>");
});

【问题讨论】:

  • 您希望它匹配整个电子邮件,还是仅匹配电子邮件的域部分?
  • 我根本不希望它与电子邮件匹配 - 我有另一个与电子邮件地址匹配的正则表达式。看,我必须把结果变成一个链接,所以我需要确保我没有收到电子邮件地址。
  • 而不是使用\S,为什么不使用[] 将您的设置限制为有效字符
  • @Joseph 这是一个相当长的网址字符列表,不是吗?
  • 另请参阅Javascript: negative lookbehind equivalent? 以及此more comprehensive answer,其中完整描述了如何匹配和替换正面和负面的lookbehinds。这是这些问题的重复。

标签: javascript regex


【解决方案1】:

JavaScript 不支持后向断言,因此您必须在自己的代码中处理这个问题。一种选择是简单地将@ 包含在结果中,然后如果@ 存在则丢弃匹配项:

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] 是一个匹配任何@987654332 字符的字符类@.)

【讨论】:

  • 我认为这不适用于我的情况,因为我需要在 REPLACE 期间创建一个真正的链接 - 所以我需要确保我的电子邮件地址不匹配。跨度>
  • @mperrenoud03:您可以使用回调而不是简单的字符串作为替换。如果您发布替换字符串,我将使用您可以使用的回调更新我的答案。
  • 我用对我有用的确切答案更新了问题 - 但你的指导让我到达了那里。
猜你喜欢
  • 2015-07-12
  • 2018-03-22
  • 1970-01-01
  • 2012-03-03
  • 2017-08-23
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多