上下文
我的代码采用url路径,并将路径参数替换为“*”。我的所有urls都遵循JSON API命名约定。所有有效的url资源部分遵循下面的规则:
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):
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
发布于 2018-05-11 15:23:34
我猜您正在寻找一个正则表达式来捕获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, '*')}`;
}, '');发布于 2018-05-11 15:48:18
你可以四处看看:
(?<=\/)[a-z][a-z0-9-]*[a-z](?=\/)
正如我在评论中所指出的,不需要使用锚^或$。还可以转义斜杠\/。只有在被斜线包围时,regex才会匹配模式[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格式在这里描述:identifier#Format
https://stackoverflow.com/questions/50295347
复制相似问题