使用regexp

时间:2018-06-04 11:47:33

标签: javascript regex

我需要解析网址/domain.com?filter[a.b.c]=value1&filter[a.b.d]=value2 得到2组:' a.b.c '和' a.b.d '。

我尝试使用正则表达式[\?&]filter\[(.+\..+)+\]=进行解析,但结果是' a.b.c] = value1& filter [a.b.d '。如何指定搜索第一次出现?

2 个答案:

答案 0 :(得分:1)

您可以使用

/[?&]filter\[([^\].]+\.[^\]]+)]=/g

请参阅regex demo

<强>详情

  • [?&] - ?&
  • filter\[ - filter[子字符串
  • ([^\].]+\.[^\]]+) - 捕获第1组:
    • [^\].]+ - 除].以外的一个或多个字符
    • \. - 一个点
    • [^\]]+ - 除]
    • 以外的1个或多个字符
  • ]= - ]=子字符串

JS演示:

var s = '/domain.com?filter[a.b.c]=value1&filter[a.b.d]=value2';
var rx = /[?&]filter\[([^\].]+\.[^\]]+)]=/g;
var m, res=[];
while(m=rx.exec(s)) {
  res.push(m[1]);
}
console.log(res);

请注意,如果&永远不会作为查询参数值的一部分出现,您可以将其添加到否定的字符类[^\].]+ =&gt; [^\]&.]+,以确保正则表达式不会超过参数值。

由于您需要在外部方括号内提取可能包含其中一个内部至少有一个点的连续[...]子串的文本,因此您可以使用更简单的正则表达式以及更多代码:

var strs = ['/domain.com?filter[a.b.c]=value1&filter[a.b.d]=value2', 
'/domain.com?filter[a.b.c]=value1&filter[a.b.d]=value2&filter[a][b.e]=value3', 
'/domain.com?filter[a.b.c]=value1&filter[b][a.b.d][d]=value2&filter[a][b.e]=value3'];
var rx = /[?&]filter((?:\[[^\][]*])+)=/g;
for (var s of strs) {
  var m, res=[];
  console.log(s);
  while(m=rx.exec(s)) {
    if (m[1].indexOf('.') > -1) {
      res.push(m[1].substring(1,m[1].length-1));
    }
  }
  console.log(res);
  console.log("--- NEXT STRING ----");
}

答案 1 :(得分:1)

(?<=[\?&]filter\[)([^\]]+\.[^\]]+)+(?!>\]=)

这只会为您提供您提到的群组(a.b.ca.b.d

此部分(?<=[\?&]filter\[)表示已识别,但未在您想要之前捕获[?&]filter,此部分(?!>\]=)表示已识别,但在]之后未捕获想。

[^\]]这会捕获不是方括号的所有内容