URL上使用特定模式提取特定参数的Javascript Regx

URL上使用特定模式提取特定参数的Javascript Regx,javascript,node.js,Javascript,Node.js,对于纯香草javascript,我有以下问题陈述 从以下不同类型的URL模式中,提取a、B和C的值(如果存在而没有“XX”值),其中a、B、C是静态单词,并以不同的位置出现在URL中 abc.com/fld1/fld2/fld3/A:XX/B:XX/C:XX - output will be "" (emtpy string as value XX) abc.com/fld1/fld2/fld3/A:XddX/B:XX/C:we33 - output will be &

对于纯香草javascript,我有以下问题陈述

从以下不同类型的URL模式中,提取a、B和C的值(如果存在而没有“XX”值),其中a、B、C是静态单词,并以不同的位置出现在URL中

abc.com/fld1/fld2/fld3/A:XX/B:XX/C:XX  - output will be "" (emtpy string as value XX)

abc.com/fld1/fld2/fld3/A:XddX/B:XX/C:we33  - output will be "XddX,we33"

abc.com/fld1/fld2/A:dd,rr,tt/B:ssww,ddd/C:kdkd,dd,d1d  - output will be "dd,rr,tt,ssww,ddd,kdkd,dd,d1d"

abc.com/fld1/fld2/A:dd,rr,tt/C:kdkd,dd,d2d - output will be "dd,rr,tt,kdkd,dd,d2d"

abc.com/fld1/fld2/C:deedd,rdr,t4dadt/B:kddkd,ddd,8udu - output will be "deedd,rdr,t4dadt,kddkd,ddd,8udu"

abc.com/fld1/fld2/C:dd,rr,tt/A:kdkd,d5d,dd6 - output will be "dd,rr,tt,kdkd,d5d,dd6"

abc.com/fld1/fld2/C:dd - output will be 'dd' 

abc.com/fld1/fld2/fld3/B:dddd - output will be 'dddd'
我尝试了以下模式,但不确定是否可以使用nagate来排除“XX”值,或者使用更好的方法来提取值

/(A:)(\w+(,\w+)*)|(B:)(\w+(,\w+)*)|(C:)(\w+(,\w+)*)/ig;

有什么特殊原因需要它是正则表达式吗?它相对简单,没有:

function parseValues(urlString) {
  const words = new Set(["A", "B", "C"]);

  const ignore = "XX";

  // Use URL API to get path
  const url = new URL(urlString);
  const path = url.pathname;

  return path.split("/") // Split the path at the slashes
    .map(i => i.split(":")) // split each item of the path at colon
    .filter(i => i.length === 2) // only regard items that had exactly one colon
    .filter(i => words.has(i[0])) // only regard values before the colon that match A, B, C
    .filter(i => i[1] !== ignore) // only regard values after the colon that don't match XX
    .map(i => i[1]) // just take the value after the colon
    .join(","); // join values with commas
}

// Added "http://" to the URLs to make them valid, also StackOverflow requires to use "example.com"

console.log(parseValues("http://example.com/fld1/fld2/A:XX/B:XX/C:XX")); // returns empty string

console.log(parseValues("http://example.com/fld1/fld2/fld3/A:XddX/B:XX/C:we33"));

console.log(parseValues("http://example.com/fld1/fld2/A:dd,rr,tt/B:ssww,ddd/C:kdkd,dd,d1d"));


编辑:

关于你的评论:

性能:除非你必须一秒钟做上千次,否则性能是不相关的。此外,我怀疑这比常规的例外情况要慢得多

ES5:所有当前相关的浏览器和其他JavaScript环境(尤其是node)都支持使用的ES6特性。或者有Transpiler和polyfills可以为您进行调整。或者,作为最后一种手段,
Set
const
可以简单地替换,并且不需要使用URL API(在这种情况下,它只是合适的工具)

代码大小:可读性比代码大小更重要。正则表达式很难添加注释,也很难阅读

程序是人类阅读的,只是顺便让计算机执行。-唐纳德·克努斯


谢谢你的回复。我正在寻找性能和Ecma脚本5和代码大小。谢谢你的答复