我有网址,并且只想匹配那些与此模式匹配的网址
^/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).*$
该模式的更具体的变体可能是
^\/zxp\/companies\/\d+\/queries\/\d+\b(?!.*\btype=inbox\b).*$
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/]*)$
关于javascript - 匹配不包含特定模式的特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65432562/