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,那么这是从查询字符串中获取数据的好方法。如果您喜欢通过提供的键名返回值的函数,可以查看。