Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于解析搜索参数的Javascript正则表达式_Javascript_Regex - Fatal编程技术网

用于解析搜索参数的Javascript正则表达式

用于解析搜索参数的Javascript正则表达式,javascript,regex,Javascript,Regex,这是我对堆栈的第一个问题,因为我真的不能把我的大脑放在正则表达式上。我正试图操纵一所大学图书馆的高级目录搜索,以便在用户搜索(比如说)几种不同类别的材料类型后,点击“修改您的搜索”按钮将它们返回到表单,并记住它们以前的所有搜索参数。这是一个古老的专有系统,因此默认情况下,它会将用户返回到搜索表单,但会强制他们从头开始 位置字符串仍然包含所有参数,所以我要做的是使用正则表达式,并用JS填充表单。这是字符串的外观: /search~S13/X?nosch=(足球)&m=i&m=g&m=r&m=r&m

这是我对堆栈的第一个问题,因为我真的不能把我的大脑放在正则表达式上。我正试图操纵一所大学图书馆的高级目录搜索,以便在用户搜索(比如说)几种不同类别的材料类型后,点击“修改您的搜索”按钮将它们返回到表单,并记住它们以前的所有搜索参数。这是一个古老的专有系统,因此默认情况下,它会将用户返回到搜索表单,但会强制他们从头开始

位置字符串仍然包含所有参数,所以我要做的是使用正则表达式,并用JS填充表单。这是字符串的外观:

/search~S13/X?nosch=(足球)&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=(足球)

我想获取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&"

您将如何获取
m=i&
中的
i
值?

我可以向您展示如何迭代字符串;您可能比我更了解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.

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

因为这是从
位置进行的。搜索
您可以执行以下操作:

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

第一个
子字符串
是从
位置的查询字符串中删除
。搜索

我可能误解了您的问题,但如果您使用的是JavaScript,我认为没有必要使用RegEx

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

var str = window.location.search.slice(1);
然后,您可以选择RegEx路径或简单的JavaScript路径

REGEX:

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

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

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

JAVASCRIPT:

更好的方法是,不使用正则表达式,而是使用符号作为分隔符,将上文定义的
str
拆分为不同属性的数组:

var arr = str.split('&');
var pairs = [];
for (var i = 0; i < arr.length; i += 1) {
    pairs[i] = arr[i].split("=");
}
因此,这将创建一个字符串数组,如
“m=i”
“m=g”
,等等

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

var arr = str.split('&');
var pairs = [];
for (var i = 0; i < arr.length; i += 1) {
    pairs[i] = arr[i].split("=");
}
要获取
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]);
    }
}
var对=[],
m_结果=[];
对于(变量i=0;i
然后,数组
m_结果
将包含搜索字符串中与
m
相关的所有值

总共只有10行代码,而且比尝试一些受折磨的正则表达式模式更容易注释、调试和重用,我认为,尽管我可以看到正则表达式会更简洁,如果你能有效地捕获它的话。

var s='/search~S13/X?nosch=(football)&m=I&m=g&m=r&m=1&m=5&m=g&m=o&m=7&m=j&m=I&m=2&m=3&m=q&m=m=m=m&SORT=D&SUBKEY=(足球);;
s、 拆分(/&/).map(函数(x){
返回x.split(/=/);
}).过滤器(功能(x){
返回x[1]=“i”;
})59

上面所有的评论都是可靠的。这是NHAHDH的道具,因为出于某种原因,我从来没有考虑过location.search。无论如何,这有点晚了,但我想回应的是,我最后做的是你的第二个建议:在interrobang之后切片字符串,然后拆分。