这是我对堆栈的第一个问题,因为,好吧,我真的无法将我的大脑包裹在正则表达式中。我正在尝试装配大学图书馆的高级目录搜索,以便在顾客搜索,例如,在几种不同类别的材料类型中搜索“足球”后,点击“修改您的搜索”按钮会将它们返回到包含所有先前搜索参数的表单记住。它是一个古老的专有系统,所以默认情况下它会将赞助人返回搜索表单,但强迫他们从头开始。
但是,位置字符串仍然具有所有参数,因此我想要做的是正则表达式并使用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&
?
答案 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']]