Javascript 正则表达式:从字符到行尾的匹配,不带最后一个匹配组

Javascript 正则表达式:从字符到行尾的匹配,不带最后一个匹配组,javascript,regex,uri,Javascript,Regex,Uri,我想从一些URL中提取q参数: .com/?gws_rd=ssl#q=test .com/search?q=something+else&source=123 下面是我提出的一个正则表达式:q=(*?)(&|$)。当&终止时,结果为: ["q=test", "test", "&"] 否则,当它到达行的末尾时: ["q=test", "test", ""] 这是可行的,但似乎不对 有没有办法不包括最后一个匹配组,因为我对它不感兴趣?将最后一个组转化为积极的前瞻性断言 (?=&

我想从一些URL中提取
q
参数:

.com/?gws_rd=ssl#q=test
.com/search?q=something+else&source=123
下面是我提出的一个正则表达式:
q=(*?)(&|$)
。当
&
终止时,结果为:

["q=test", "test", "&"]
否则,当它到达行的末尾时:

["q=test", "test", ""]
这是可行的,但似乎不对


有没有办法不包括最后一个匹配组,因为我对它不感兴趣?

将最后一个组转化为积极的前瞻性断言

(?=&|$)
断言匹配后必须跟一个
&
或线锚的末尾
$

q=(.*?)(?=&|$)

仅打印捕获组中的字符

> var s = ".com/?gws_rd=ssl#q=test"
undefined
> console.log(/q=(.*?)(?=&|$)/.exec(s)[1]);
test

这很有效,谢谢。有没有办法防止JS也包括第一个捕获组?意思是,只看到
['test']
?是的,我知道如何从结果数组中取出它,我只是好奇为什么JS包含第一个匹配
q=test
,而不仅仅是结果。我想它的意思是“这就是匹配的内容,这就是结果”-当访问可能为空的数组时,我只是有点不安。JS打印匹配
q=test
以及捕获
test
。匹配位于索引0,捕获位于索引1。。。。为什么不将正则表达式更改为
/q=(.*?[&|$]/
?您不是要匹配
&|$
,而是要将它们作为一个组进行评估。@与第一个不匹配的内部开发人员url@Thelron
[&|$]
将超出您的假设。您是对的,管道在那里没有意义。这里有一个更好的正则表达式,它对这两种语言都有效:
/q=([^&]*)/
。我现在仍在评论的唯一原因是前瞻正则表达式的性能很差。@他们的内部开发人员很有趣,并得到了适当的注意。
> var s = ".com/?gws_rd=ssl#q=test"
undefined
> console.log(/q=(.*?)(?=&|$)/.exec(s)[1]);
test