Javascript使用非捕获组获取查询字符串值
给定此查询字符串:Javascript使用非捕获组获取查询字符串值,javascript,regex,Javascript,Regex,给定此查询字符串: ?cgan=1&product_cats=mens-jeans,shirts&product_tags=fall,classic-style&attr_color=charcoal,brown&attr_size=large,x-small&cnep=0 如何仅从这些参数类型中提取值'product\u cat、product\u tag、attr\u color、attr\u size'仅返回'mens-jeans、shirt、fa
?cgan=1&product_cats=mens-jeans,shirts&product_tags=fall,classic-style&attr_color=charcoal,brown&attr_size=large,x-small&cnep=0
如何仅从这些参数类型中提取值'product\u cat、product\u tag、attr\u color、attr\u size'
仅返回'mens-jeans、shirt、fall、classic style、木炭色、棕色、大号、x-small
我尝试对参数类型使用非捕获组,对值使用捕获组,但它同时返回这两个值
(?:product_cats=|product_tags=|attr\w+=)(\w|,|-)+
您可以使用以下简单正则表达式:
/&\w+=([\w,-]+)/g
您需要返回捕获组的结果,并使用,
将其拆分
var mystr="?cgan=1&product_cats=mens-jeans,shirts&product_tags=fall,classic-style&attr_color=charcoal,brown&attr_size=large,x-small&cnep=0
";
var myStringArray = mystr.match(/&\w+=([\w,-]+)/g);
var arrayLength = myStringArray.length-1; //-1 is because of that the last match is 0
var indices = [];
for (var i = 0; i < arrayLength; i++) {
indices.push(myStringArray[i].split(','));
}
var mystr=“?cgan=1&product\u cats=男式牛仔裤、衬衫和产品标签=秋季、经典款式和属性颜色=木炭、棕色和属性尺寸=大号、x-small和cnep=0
";
var myStringArray=mystr.match(/&\w+=([\w,-]+)/g);
var arrayLength=myStringArray.length-1//-1是因为最后一个匹配是0
var指数=[];
对于(变量i=0;i
您可以始终使用jQuery方法。类似
/(?:product_cats|product_tag|attr_color|attr_size)=[^,]+/g
将与(?:产品猫|产品标签|属性颜色|属性大小)
或产品猫
或产品标签
或属性颜色
属性大小)
匹配一个等于=
求反字符类匹配除[^,]
以外的任何字符。基本上它一直匹配到下一个,
,
string = "?cgan=1&product_cats=mens-jeans,shirts&product_tags=fall,classic-style&attr_color=charcoal,brown&attr_size=large,x-small&cnep=0";
matched = string.match(/(product_cats|product_tag|attr_color|attr_size)=[^,]+/g);
for (i in matched)
{
console.log(matched[i].split("=")[1]);
}
将产生如下产出:
mens-jeans
charcoal
large
您可以使用
(?:product_cats|product_tags|attr\w+)=([\w,-]+)
请注意,字符类([\w,-]+
)比备选字符列表((\w |,|-)*
)更有效,并且我们避免了仅捕获最后一个字符的问题
下面是一个代码示例:
var re=/(?:产品|产品|标签|属性| w+=([\w,-]+)/g;
var str='?cgan=1和product_cats=男士牛仔裤、衬衫和product_标签=秋季、经典款式和属性颜色=木炭色、棕色和属性尺寸=大、x-小和cnep=0';
var-res=[];
while((m=re.exec(str))!==null){
res.push(m[1]);
}
document.getElementById(“res”).innerHTML=res.join(“,”)代码>
不需要正则表达式。只需使用split
s和join
s即可
var s = '?cgan=1&product_cats=mens-jeans,shirts&product_tags=fall,classic-style&attr_color=charcoal,brown&attr_size=large,x-small&cnep=0';
var query = s.split('?')[1],
pairs = query.split('&'),
allowed = ['product_cats', 'product_tags', 'attr_color', 'attr_size'],
results = [];
$.each(pairs, function(i, pair) {
var key_value = pair.split('='),
key = key_value[0],
value = key_value[1];
if (allowed.indexOf(key) > -1) {
results.push(value);
}
});
console.log(results.join(','));
($。每个都来自jQuery,但是如果jQuery不存在,可以很容易地替换)您没有使用组,因此我会在这个正则表达式中的备选列表周围设置一个非捕获组。这个正则表达式不能正确执行任务。@Stribizev是的,我已经将它编辑成了一个非捕获组。谢谢你,这确实管用。但是,我忘了提到,我并不总是知道属性参数(attr_?)的值与“product_cats”和“product_tags”不同。因此,我认为我需要依赖正则表达式来完成这一步。嗯,您可以随时更改允许的列表/条件,例如,if(allowed.indexOf(key)>-1 | | key.indexOf('attr|')==0)
。但这取决于你。我通常尽量避免使用regexp。我认为,如果可以通过字符串操作解决某些问题,那么它的读取和性能将比regexp更好。这非常好。你认为这是实现这一目标的有效途径吗。感谢您提供有关字符类的提示。如果您使用的是纯JS,那么这是从查询字符串中获取数据的好方法。如果您喜欢通过提供的键名返回值的函数,可以查看。