用于解析搜索参数的Javascript RegEx

时间:2013-01-30 15:33:00

标签: javascript regex

这是我对堆栈的第一个问题,因为,好吧,我真的无法将我的大脑包裹在正则表达式中。我正在尝试装配大学图书馆的高级目录搜索,以便在顾客搜索,例如,在几种不同类别的材料类型中搜索“足球”后,点击“修改您的搜索”按钮会将它们返回到包含所有先前搜索参数的表单记住。它是一个古老的专有系统,所以默认情况下它会将赞助人返回搜索表单,但强迫他们从头开始。

但是,位置字符串仍然具有所有参数,因此我想要做的是正则表达式并使用JS填充表单。这就是字符串的样子:

/search~S13/X?NOSRCH=(football)&m=i&m=g&m=r&m=r&m=1&m=5&m=g&m=o&m=7&m=j&m=i&m=2&m=3&m=q&m=m&SORT=D&SUBKEY=(football)

我想获取m的值,这可能比上面的例子多出几次。到目前为止,我正在这样做:

var str = location.search.match(/m.*?&/g);

返回

"m=i&", "m=g&", "m=r&", "m=r&", "m=1&", "m=5&", "m=g&", "m=o&", "m=7&", "m=j&", "m=i&", "m=2&", "m=3&", "m=q&", "m=m&"

您如何仅仅抓取i中的值m=i&

4 个答案:

答案 0 :(得分:1)

我可以告诉你如何迭代字符串;你可能比我更了解JavaScript,所以你知道如何用这些结果制作一个数组:

var myregexp = /\bm=([^&]*)/g;
var match = myregexp.exec(subject);
while (match != null) {
    // matched text: match[1], add that to your result array
    }
    match = myregexp.exec(subject);
}
正则表达式的

解释

\b      # Start at the beginning of an alphanumeric "word"
m=      # (in this case, it's just one letter) "m", followed by "="
(       # Match and capture in group number 1:
 [^&]*  #  any number of characters except ampersands
)       # End of capturing group.

据我所知,没有直接的方法来填充只包含捕获组匹配的数组,而不是整个正则表达式的匹配。

答案 1 :(得分:1)

由于这来自location.search,你可以这样做:

location.search.substring(1).split('&').filter(function (e) {
    return /^m=/.test(e);
}).map(function (e) {
    return e.substring(2); 
});

第一个substring是从?中的查询字符串中删除location.search

答案 2 :(得分:1)

我可能误解了您的问题,但如果您使用的是JavaScript,我认为RegEx不是必需的。

在任何情况下,首先,获取字符串的搜索部分并将问号标记在开头,例如,

var str = window.location.search.slice(1);

然后你可以选择RegEx路线或简单的JavaScript路线。

<强> REGEX:

使用非捕获和捕获组创建模式(在括号中):

var regexPttrn = /(?:m\=)([^&=]+)/ig;

第一组使用?:查找字符m=。一旦找到它们,它就会捕获任何不是符号或等号的连续字符组。

不幸的是,您必须使用exec方法来执行此操作,并且也在循环内,因为exec一次只匹配一个匹配,并且您需要检查返回的数组是否具有使用它之前需要的属性等。

<强> JAVASCRIPT:

更好的是,使用&符号作为分隔符,而不是使用RegEx,将上面定义的str拆分为不同属性的数组:

var arr = str.split('&');

因此,这将创建一个字符串数组,如"m=i""m=g"等。

然后通过运行循环并使用等号作为分隔符来分割arr的每个元素,将其中的每一个分成键值对:

var pairs = [];
for (var i = 0; i < arr.length; i += 1) {
    pairs[i] = arr[i].split("=");
}

这样你就会得到一个包含几个小数组的数组,结构如下:

[
    [ "NOSRCH", "FOOTBALL" ],
    [ "m", "i" ],
    [ "m", "g" ],
    /* and so on, until... */
    [ "EY", "(football)" ]
]

要只获取m的值,你可以修改上面的循环来创建一个只包含这些值的数组:

var pairs = [],
    m_results = [];
for (var i = 0; i < arr.length; i += 1) {
    pairs.push(arr[i].split("="));
    if (pairs[i][0] === "m") {
        m_results.push(pairs[i][1]);
    }
}

数组m_results将包含搜索字符串中与m相关联的所有值。

总共只有10行代码,并且比我尝试一些折磨的RegEx模式更容易评论,调试和重用,尽管我可以看到RegEx会更简洁,如果你能有效地捕获它。 / p>

答案 3 :(得分:0)

var s = '/search~S13/X?NOSRCH=(football)&m=i&m=g&m=r&m=r&m=1&m=5&m=g&m=o&m=7&m=j&m=i&m=2&m=3&m=q&m=m&SORT=D&SUBKEY=(football)';
s.split(/&/).map(function(x) {
  return x.split(/=/);
}).filter(function(x) {
  return x[1] == 'i';
}); // => [['m', 'i'], ['m', 'i']]