javascript - 匹配不包含特定模式的特定字符串

标签 javascript regex

我有网址,并且只想匹配那些与此模式匹配的网址

^/zxp/companies/.*?/queries/.*?$

但不包含此type=inbox - 例如 - regexp 应给出以下结果:

"/zxp/companies/432523/queries/4344?read=2&type=inbox"   -> FALSE
"/zxp/companies/432523/queries/4344?type=inbox&read=2"   -> FALSE
"/zxp/companies/432523/queries/4344?type=query&read=2"   -> TRUE
"/zxp/companies/432523/queries/4344"                     -> TRUE
"/zxp/companies/432523/buildings/4344?type=query&read=2" -> FALSE
"/zxp/companies/432523/buildings/4344"                   -> FALSE

我尝试了这个,但得到了错误的结果(仅当 type=inbox 位于字符串末尾时才有效)

let re = /^\/zxp\/companies\/.+?\/queries\/.*(?<!type=inbox)$/

let tests = [
  "/zxp/companies/432523/queries/4344?read=2&type=inbox",
  "/zxp/companies/432523/queries/4344?type=inbox&read=2",
  "/zxp/companies/432523/queries/4344?type=query&read=2",
  "/zxp/companies/432523/queries/4344",
  "/zxp/companies/432523/buildings/4344?type=query&read=2",
  "/zxp/companies/432523/buildings/4344",
]



tests.forEach(t => console.log(`${t} -> ${re.test(t)}`))

如何使用 JavaScript RegExp 来做到这一点?

最佳答案

您尝试的模式断言字符串不以 type=inbox 结尾使用(?<!type=inbox)$这是一种消极的回顾。

您可以使用否定前瞻,将其添加到 /queries/ 之后,从该位置断言 type=inbox不会出现在右侧。

注意它也会匹配 /zxp/companies/432523/queries/

^\/zxp\/companies\/.+?\/queries\/(?!.*\btype=inbox\b).*$

Regex demo

该模式的更具体的变体可能是

^\/zxp\/companies\/\d+\/queries\/\d+\b(?!.*\btype=inbox\b).*$

Regex demo

let re = /^\/zxp\/companies\/.+?\/queries\/(?!.*type=inbox).*$/

let tests = [
  "/zxp/companies/432523/queries/4344?read=2&type=inbox",
  "/zxp/companies/432523/queries/4344?type=inbox&read=2",
  "/zxp/companies/432523/queries/4344?type=query&read=2",
  "/zxp/companies/432523/queries/4344",
  "/zxp/companies/432523/buildings/4344?type=query&read=2",
  "/zxp/companies/432523/buildings/4344",
]



tests.forEach(t => console.log(`${t} -> ${re.test(t)}`))


因为有more support在 Javascript 中使用后视,另一个选项可能是您尝试的模式的变体,断言最后一个 / 之后的部分不包含 type=inbox。

^\/zxp\/companies\/.+?\/queries\/.*(?<!\btype=inbox\b[^\r\n/]*)$

Regex demo

关于javascript - 匹配不包含特定模式的特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65432562/

相关文章:

javascript - 如何避免office-js中过多的context.loads()

javascript - 如何使用 fetch 在 firefox 或 chrome 扩展程序中获取网页的 HTML 源代码?

php - 如何在 php 中引用 HTML 元素?

javascript - 如何使用 javascript 从字符串中删除 ¶

Java Scanner 按句子拆分字符串

regex - 使用 htaccess 重定向到相同 URL 的小写版本

javascript - 使用包含\和/使用正则表达式分割路径

Javascript:使用正则表达式反向引用引用数组元素

regex - 使用 Visual Studio 进行条件替换

javascript - 通过过滤器数组设置对象数组的属性