javascript - 如何修改正则表达式以避免 url 中的最后一个点
问题描述
这是我的正则表达式:
const urlReg = /((\w*?)((:\/\/)|www|\w\.{1}\w{2,})[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)/g;
https://regex101.com/r/rET1Le/1
我已经在标签中排除了 url,所以这个 url 中的最后一个点只有一个问题:https ://testask.com/item/45e20490-2b86-4b6a-8772-5ed96f64de52 。有人知道如何修改我的 RegExp 以避免这个点吗?
解决方案
如果你做对了,违规的情况是你的样本中的第二个匹配项。在比赛的和。使用 PCRE 正则表达式,可以通过如下的后向断言轻松解决此问题(?<!\.)
:
((\w*?)((:\/\/)|www|\w\.{1}\w{2,})[^"<\s]+(?<!\.))(?![^<>]*>|[^"]*?<\/a)
不幸的是,这在(当前)JavaScript 的正则表达式引擎中不起作用。作为替代方案,我们可以使用(?:(?!avoid).)+
模式排除在您的内部所有内容之前添加点,但模式[^"<\s]+
;但是,它有点混乱,因为您必须使用按长度(从长到短)排序的多个交替来解决.
之前存在决赛的情况<|"|\s
:
((\w*?)((:\/\/)|www|\w\.{1}\w{2,})(:?(?!\.\s|\s|\."|"\.<|<).)+)(?![^<>]*>|[^"]*?<\/a)
const regex = /((\w*?)((:\/\/)|www|\w\.{1}\w{2,})(:?(?!\.\s|\s|\."|"\.<|<).)+)(?![^<>]*>|[^"]*?<\/a)/g;
const str = `djfhjkshd fjkshkdjfhsjkdhfjk jdsfh ksjdfksd fkdsf dkfh kjh<br>You can open your link here: https://testask.com/item/45e20490-2b86-4b6a-8772-5ed96f64de52. dsjfklj skldjfklsdjfkl. dsjfjshdfjk skdhfshdfj skdhfjshfjsahfjhasjfh shfk.<br>sdkfhklsdjf kljsdklf kdsljfkljafkljkl .`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log(m[0]);
// The result can be accessed through the `m`-variable.
//m.forEach(match => {
// console.log(`Found match: ${match}`);
//});
}
然而,最简单的解决方案是在之后简单地修剪尾随点。
推荐阅读
- pycharm - PyCharm“无法获取部署服务器的远程凭据”
- java - 在并行流处理中捕获时序
- android - 具有唯一索引的房间数据库迁移问题
- python - python无法在imagemagick策略错误中通过https打开文件
- java - 当我的应用不使用这些权限时,仍然在 Google Play 控制台中收到那些 SMS 和 CALL_LOG 警告?
- reactjs - 笑话/酶 | 在 componentDidMount 中测试函数调用
- python - 推荐系统的网络服务
- react-native - 是否有用于基本 CRUD 任务的 React Native 框架?
- javascript - 如何通过 XMLHttpRequest GET 方法向 django 传输信息?
- discord - discord.js 使用命令添加数字