首页 > 解决方案 > JavaScript中的正则表达式否定后向替换

问题描述

我有一个带有否定后向断言的 JS 正则表达式,在基于 Chromium 的浏览器中运行良好:

(?<!https?:)\/\/(.+?)(?<!https?:)\/\/gmi

我需要将其替换为另一个以实现跨浏览器兼容性(在 FF 或 Safari 中不起作用)。

正则表达式的意思是“查找并捕获斜杠内的所有事件 // //,除非之前 // 保持 http: 或 https:”。

例子:

bar //foo bar// foo - match (capture //foo bar//)
//https://stackoverflow.com/// - match (capture https://stackoverflow.com/)
https://stackoverflow.com// - not match
//foo http://stackoverflow.com - not match

现场演示

正如@BaliBalo 所说,我当前的正则表达式包含错误并且工作不完美 错误演示 我需要捕获https://stackoverflow.com///https://stackoverflow.com///

标签: javascriptregexnegative-lookbehind

解决方案


如果您只想在替换中使用它们,则可以尝试相反的方法。如果它在那里,也捕获你不想要的东西,如果是这种情况,请忽略匹配。这在某些边缘情况下的行为略有不同,但在大多数情况下是可以接受的。

例如,您的正则表达式可能是:

let result = input.replace(/(https?:)?\/\/((?:https?:\/\/|.)+?)\/\//g, (m, e1, val) => e1 ? m : '[match](' + val + ')');

推荐阅读