我在这里看到了许多其他问题围绕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>");
});
答案 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
字符的字符类。)