如果变量包含" / agency /:something"我需要返回true,我通过使用:/agency/.*实现了这一点。问题是,我不想匹配" / agency /:somethig /:morestuff",我写的正则表达式匹配。
const whitelist = [
'\/agency\/.*',
'\/agenzia\/.*'
];
const re = new RegExp(whitelist.join("|"));
console.log(re.test("/agency")); //FALSE
console.log(re.test("/agency/foo")); //TRUE
console.log(re.test("/agency/foo/bar")); //TRUE (But I need it to be false)
如何扩展Regex以使其在最后一个console.log语句中返回false?
答案 0 :(得分:2)
您需要使用^
和$
告诉您的RegEx从字符串的开头开始并在结束时结束。
另外,使用[^\/]
代替.
以避免额外的/
const whitelist = [
'^\/agency\/[^\/]*$',
'^\/agenzia\/[^\/]*$'
];
const re = new RegExp(whitelist.join("|"));
console.log(re.test("/agency")); //FALSE
console.log(re.test("/agency/foo")); //TRUE
console.log(re.test("/agency/foo/bar")); //FALSE
答案 1 :(得分:0)
尝试在whitelist.join("|")
的非捕获组中使用alternation,并在该匹配后使用否定的字符类[^\/]+
,直到遇到正斜杠。
使用^
断言行的开头,使用$
断言行尾。
const whitelist = [
'\/agency\/',
'\/agenzia\/'
];
const re = new RegExp("^(?:" + whitelist.join("|") + ")[^\/]+$");
console.log(re.test("/agency"));
console.log(re.test("/agency/foo"));
console.log(re.test("/agency/foo/bar"));