如何从JavaScript内部url中排除Regex匹配



我当前的正则表达式在句子中查找searchQuery,如果这些查询以空格开始,并以空格或?!,.结束,则匹配它们。它通常工作得很好,除了url。正则表达式最终会拾取url并把它们弄乱。

例如,如果我正在寻找"bitcoin"在一个句子中"比特币价格要疯了",它会找到它,但它也会取下面的url并匹配它。https://versionone.vc/the-solar-比特币-convergence,搞乱url。

我怎样才能告诉JavaScript Regex忽略任何匹配,其中匹配词之前的字符是这些/ - . _ +中的任何一个?这将基本上消除url内的匹配?

当前正则表达式:var reg = new RegExp('(\b)${searchQuery}(\s+|\.|\,|\?|\!', 'gi');

替换功能:newString = oldString.replace(reg, substringReplacement);

substringReplacement(match)是包含如何更改匹配文本的逻辑的函数。

或者,直接忽略可搜索区域中的url的另一种方法是什么?谢谢!

在现代Javascript中,你可以在Javascript中使用动态长度断言,所以你可以尝试:

var reg = new RegExp('(?<!https?://\S*)\b${searchQuery}[\s.,?!]', 'gi');

RegEx演示

(?<!https?://\S*)是负向后查找,如果在匹配之前发现http://https://后面有0个或多个非空白字符,则匹配失败。

我会匹配URL的格式匹配searchQuery模式,然后使用一个替换函数来检查URL或searchQuery是否匹配。在URL的情况下,替换为URL(这样在这种情况下没有任何内容被替换)。

如果你想使用${}风格的插值,你还需要为模板文字使用反引号。

// make this as elaborate as you want:
// https://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-if-a-string-is-a-valid-url
var reg = new RegExp(`(https?://S+)|(\b)${searchQuery}\s+|\.|\,|\?|\!`, 'gi');
newString = oldString.replace(reg, (match, g1) => g1 ? match : substringReplacement);

您还需要确保()组是平衡的(在您当前的代码中,它们不是,因此new RegExp调用当前将抛出SyntaxError)

没有显示substringReplacement,但是除非您使用组来替换,否则您可以完全省略捕获组,除了URL部分。

虽然其他评论更正确,但就Regex而言,由于Safari不支持反向展望,所以我没有提出一个解决方案。我可以提前查找并拒绝最可能是url的匹配,而不是尝试对字符串求反。

${searchQuery}(?!-|/|.com)将跳过url的很大一部分,除非searchQuery单词是url的最后一个单词。

当我找到完美的答案时,我会贴在这里。

最新更新