【问题标题】:Match a URL with placeholders with a URL with filled placeholders将带有占位符的 URL 与带有填充占位符的 URL 匹配
【发布时间】:2018-10-21 21:52:08
【问题描述】:

我正在尝试匹配两个 URL,一个带有占位符,一个带有在 Angular 中使用 TypeScript 填充的占位符。

举例

URL 之前占位符被填充:

http://this/is/{placeholder1}/{placeholder2}/my/url?limit=10&offset=5

URL 之后占位符被填充:

http://this/is/100Banana/200Apple/my/url?limit=10&offset=5

目标是用 Regex 匹配这两个 URL 并获得匹配。问题之一是,占位符可以填充 URL 允许的任何内容。

第一次尝试是在正则表达式匹配之前用正则表达式替换占位符,例如[^/]+。但这仅在占位符位于 URL 末尾时才有效。

【问题讨论】:

  • 什么意思?你想要一个比较两个字符串的函数/一段代码,如果第一个字符串是带有占位符的 URL,第二个是带有填充占位符的 URL,那么这两个将被认为是相等的?
  • 使用var regex1 = new RegExp('foo', 'g'); g 使搜索全局化。

标签: javascript regex angular typescript pattern-matching


【解决方案1】:

如果您只需要匹配它们,那么您不需要正则表达式。你可以这样做。

const str1 = 'http://this/is/{placeholder1}/{placeholder2}/my/url?limit=10&offset=5';
const str2 = 'http://this/is/100Banana/200Apple/my/url?limit=10&offset=5';

// url1: url with placeholders
// url2: url with filled placeholders
const compareUrls = (url1, url2) => {
  const u1 = url1.split('/');
  const u2 = url2.split('/');

  if (u1.length !== u2.length) { return false; }

  for (let i = 0; i < u1.length; i++) {
    if (u1[i].startsWith('{placeholder')) { continue; }
    if (u1[i] !== u2[i]) { return false; }
  }
  return true;
};

console.log(compareUrls(str1, str2));

【讨论】:

  • 如果填充的占位符包含'/',则此方案无效
  • @Rak2018 我不这么认为。请提供失败的具体示例。
  • 非常感谢@MatusDubrava!稍作调整,它似乎就可以工作。我刚刚添加了所有可能的占位符以进行检查。对于未来,这个功能可能会变得复杂,但现在它应该做到这一点。我还使用包含正斜杠 (/) 字符的 url 参数进行了测试,就像提到的 @Rak2018 一样,它不再适用了。
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 2014-10-14
  • 2014-12-25
  • 1970-01-01
  • 2016-07-17
  • 2012-06-16
  • 2014-10-09
  • 1970-01-01
相关资源
最近更新 更多