除非有斜线,否则如何在某个角色后匹配任何内容?

时间:2018-04-20 14:43:39

标签: javascript regex

如果变量包含" / 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?

2 个答案:

答案 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"));