【问题标题】:Regex for url resource parturl 资源部分的正则表达式
【发布时间】:2018-10-22 01:11:18
【问题描述】:

上下文

我的代码采用 url 路径并将路径参数替换为“*”。 我所有的网址都遵循JSON API 命名约定。 所有有效的 url 资源部分都遵循以下规则:

  • 成员名称应该以字符“a-z”开头和结尾(U+0061 到 U+007A)
  • 成员名称应仅包含字符“a-z” (U+0061 到 U+007A)、“0-9”(U+0030 到 U+0039)和连字符减号 (U+002D HYPHEN-MINUS, “-”) 作为多个单词之间的分隔符。

pass 参数通常是一个 id(数字、uuid、guid 等)。

以下是几个转换示例:

  • /user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info -> /user/*/info
  • /user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f -> /user/*
  • /user/1 -> /user/*

我有什么

/^[a-z][a-z0-9-]*[a-z]$/

问题在于它没有将 uuid 作为路径参数处理。

这是我解析 url 的函数(抱歉没有时间创建 jsfiddle):

const escapeResourcePathParameters = resource => resource
  .substr(resource.startsWith('/') ? 1 : 0)
  .split('/')
  .reduce((url, member) => {
     const match = member.match(REGEX.JSONAPI_RESOURCE_MEMBER);

     const part = match
         ? member
         : '*';

     return `${url}/${part}`;
}, '');

问题

我需要一个符合上述规则并适用于上述示例的正则表达式。

更新: 我添加了用于解析 url 的函数。要测试您的正则表达式,只需将其替换为 REGEX.JSONAPI_RESOURCE_MEMBER 并传递 URL,如 /user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info,应该返回/user/*/info

【问题讨论】:

  • 什么是“路径参数”(需要用“*”代替)——如何“识别”?
  • /user/1 中的1 如何符合Member names SHOULD start and end with the characters “a-z” 的要求?
  • @MatusDubrava 因为在这种情况下1 是一个参数,而不是 API 的成员。
  • @MatusDubrava 不会导致,1是路径参数,不应该遵守规则,我需要替换它
  • 就是这样的问题,我需要找到不符合规则的资源部分并替换它们

标签: javascript regex parsing url


【解决方案1】:

我猜你正在寻找一个正则表达式来捕获 UUID:

这应该在 javascript 中工作:

/[a-z][a-z0-9]+[-]+[a-z0-9-]+[a-z]/

我想一个UUID应该至少有两个词,所以至少有一个“-”

let a = "/user/e09e4f9f-cfcd-4a23-a88a/info"

const match = a.match(/[a-z][a-z0-9]+[-]+[a-z0-9-]+[a-z]/)

console.log(match[0])

所以对于您的代码,它应该类似于

 const escapeResourcePathParameters = resource => resource
  .substr(resource.startsWith('/') ? 1 : 0)
  .split('/')
  .reduce((url, member) => {
    // with  REGEX.JSONAPI_RESOURCE_MEMBER = /[a-z][a-z0-9]*[-]+[a-z0-9-]+[a-z]/
    return `${url}/${member.replace(REGEX.JSONAPI_RESOURCE_MEMBER, '*')}`;

 }, '');

【讨论】:

  • 我不这么认为,user 部分只是一个例子,它可以是/info/user/1/list/5
  • 以及.*如何处理上述规则?
  • >我想一个 UUID 应该至少有两个词,所以至少一个“-”是正确的,但这不起作用,我将分享一些解析 url 的代码跨度>
【解决方案2】:

您可以使用环视:

(?<=\/)[a-z][a-z0-9-]*[a-z](?=\/)

正如我在评论中所指出的,无需使用锚点 ^ 或 $。也转义斜线\/。正则表达式只有在被斜线包围时才会匹配模式[a-z][a-z0-9-]*[a-z]。

/user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info # result:  /*/*/info
/user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f      # result:  /*/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f
/user/1                                         # result: /*/1

要匹配 UUID,请使用:

(?<=\/)[a-z0-9-]{8}-(?:[a-z0-9-]{4}-){3}[a-z0-9-]{12}(?=\/)

这里描述了 UUID 格式:https://en.wikipedia.org/wiki/Universally_unique_identifier#Format

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2020-01-02
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多