URL上使用特定模式提取特定参数的Javascript Regx
对于纯香草javascript,我有以下问题陈述 从以下不同类型的URL模式中,提取a、B和C的值(如果存在而没有“XX”值),其中a、B、C是静态单词,并以不同的位置出现在URL中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 &
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和代码大小。谢谢你的答复