Javascript使用非捕获组获取查询字符串值

时间:2015-06-01 08:42:47

标签: 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_cat, product_tag, attr_color, attr_size'的这些参数类型'mens-jeans,shirts,fall,classic-style,charcoal,brown,large,x-small中提取值?

我尝试将非捕获组用于param类型并仅为值捕获组,但它返回两者。

(?:product_cats=|product_tags=|attr\w+=)(\w|,|-)+

5 个答案:

答案 0 :(得分:2)

您可以使用

收集值
(?:product_cats|product_tags|attr\w+)=([\w,-]+)

请注意,字符类([\w,-]+)比替代列表((\w|,|-)*)更有效,并且我们避免捕获最后一个字符的问题。

以下是代码示例:



var re = /(?:product_cats|product_tags|attr\w+)=([\w,-]+)/g; 
var str = '?cgan=1&product_cats=mens-jeans,shirts&product_tags=fall,classic-style&attr_color=charcoal,brown&attr_size=large,x-small&cnep=0';
var res = [];
while ((m = re.exec(str)) !== null) {
    res.push(m[1]);
}
document.getElementById("res").innerHTML = res.join(",");

<div id="res"/>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用以下简单的正则表达式:

/&\w+=([\w,-]+)/g

Demo

您需要返回捕获组的结果并将其与,分开。

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(','));
}

答案 2 :(得分:1)

您始终可以使用jQuery方法param

答案 3 :(得分:0)

这样的东西
/(?:product_cats|product_tag|attr_color|attr_size)=[^,]+/g
  • (?:product_cats|product_tag|attr_color|attr_size)将与product_catsproduct_tagattr_colorattr_size)

  • 相匹配
  • =匹配等于

  • [^,]否定字符类匹配,以外的任何内容。基本上它匹配到下一个,

Regex Demo

<强>测试

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

答案 4 :(得分:0)

不需要正则表达式。只需使用splitjoin 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不在,可以轻松替换)