首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >url资源部件的Regex

url资源部件的Regex
EN

Stack Overflow用户
提问于 2018-05-11 15:12:49
回答 2查看 548关注 0票数 0

上下文

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

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

pass param通常是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作为路径param来处理。

下面是我的函数,它解析url (对不起,没有时间创建一个jsfiddle):

代码语言:javascript
运行
复制
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}`;
}, '');

问题

我需要一个正则表达式,它遵循上述规则,并适用于上面的示例。

UPD:,我添加了用于解析urls的函数。要测试regex,只需将其替换为REGEX.JSONAPI_RESOURCE_MEMBER并像/user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info一样传递url,它应该返回/user/*/info

EN

回答 2

Stack Overflow用户

发布于 2018-05-11 15:23:34

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

这应该适用于javascript:

代码语言:javascript
运行
复制
/[a-z][a-z0-9]+[-]+[a-z0-9-]+[a-z]/

我认为UUID应该至少有两个单词,所以至少有一个"-“

代码语言:javascript
运行
复制
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])

所以对于您的代码,应该是这样的

代码语言:javascript
运行
复制
 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, '*')}`;

 }, '');
票数 1
EN

Stack Overflow用户

发布于 2018-05-11 15:48:18

你可以四处看看:

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

正如我在评论中所指出的,不需要使用锚^$。还可以转义斜杠\/。只有在被斜线包围时,regex才会匹配模式[a-z][a-z0-9-]*[a-z]

代码语言:javascript
运行
复制
/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格式在这里描述:identifier#Format

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50295347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档