我当前的正则表达式在句子中查找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的最后一个单词。
当我找到完美的答案时,我会贴在这里。