愚蠢的正则表达式URL匹配

时间:2019-02-21 05:21:42

标签: regex

所以我想要这个:

/services/auth/token

要与此匹配:

http://localhost:3000/services/auth/token/尾随/可选

但不是这样:

http://localhost:3000/services/auth/token/refresh

我通常在这方面比较擅长,但我有点困。如此帮助!!

编辑:

非常感谢,但是我应该说想使用变量来做到这一点,这让我感到困惑。抱歉,我无法添加JS标签。

const myPath = '/services/auth/token';
const pathToCheck = 'http://localhost:3000/services/auth/token/';

pathToCheck.match(myPath); // doesn't work, also matches against refresh

3 个答案:

答案 0 :(得分:1)

您可以避免使用正则表达式,而将endsWith与2个字符串一起使用(一个不带尾随/,另一个带):

const myPath = '/services/auth/token';
const pathToCheck = 'http://localhost:3000/services/auth/token/';

var matched = false;

// without trailinbg slash
matched = pathToCheck.endsWith(myPath);
console.log(matched);

// with trailinbg slash
matched = pathToCheck.endsWith(myPath + '/');
console.log(matched);


IE不支持某些String方法,例如String.endsWith。要使此方法在IE中起作用,请使用:

if (!String.prototype.endsWith) {
  String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
  };
}

Reference

答案 1 :(得分:0)

一个简单的否定前瞻应该在这里起作用:

\/services\/auth\/token\/(?!refresh\b).*

上面的模式说要匹配/services/auth/token/,只要后面的内容不是refresh

Demo

相反,如果您有一条可能遵循的接受路径的白名单,那么我们可以使用这些路径代替否定的前瞻。

答案 2 :(得分:0)

您可以尝试以下操作:

regex = /services\/auth\/token\/?$/

这确保您的字符串必须在token之后的可选斜杠处结束。