正则表达式匹配URI中的&符号,后面跟一个等号而不是另一个&符号

Jam*_*mes 5 javascript regex

我的正则表达式知识正在逃避这一点......

假设我有一个带有URI作为查询参数的URL,ala:

http://hostname.com?uri=http://website.com/company/YoYo+&+Co+Inc&type=company
Run Code Online (Sandbox Code Playgroud)

...假设我们的uri param本身不包含任何params,我想在Javascript中手动解析查询参数,但很明显我们的嵌入式uri param中的&符号使得更难以分解所有的&符号并运行它从那里.

我真正想要做的是定义一个只匹配问号和符号的正则表达式,在跟随另一个&符号(或行尾)之前跟随等号.我提出了这个很接近,但也包括非捕获文本,我不知道为什么:

[?&](?:[^&]+)=
Run Code Online (Sandbox Code Playgroud)

...导致匹配?uri=以及&type=接近但是捕获超出我想要的匹配.我在做什么错了,使得它不只是捕获的?,并&在比赛吗?换句话说,它应该只捕获?uri &之前和之前的类型.

JDi*_*rro 6

如果我理解正确而你只是想匹配?或者然后你的正则表达式应该是:

[?&](?==)
Run Code Online (Sandbox Code Playgroud)

说明:

[?&]是一组包含的字符?和&.意思是它将寻找其中之一.

(?= )这是一个积极的前瞻.这意味着"这必须在主要比赛之后但不包括它".所以要让它找到一个看起来很有趣的东西(?==)


如果要包含单词"uri"或"type" \w,请在字符集之后和前瞻之前添加一个:

[?&]\w+(?==)
Run Code Online (Sandbox Code Playgroud)

+ 表示"匹配1或更多"


还有一个,如果不是你正在寻找的那个!如果你想摆脱&/?但保留文本,我们将字符集包装在正面lookBEHIND中.语法是(?<= ).这会将正则表达式改为:

(?<=[?&])\w+(?==)
Run Code Online (Sandbox Code Playgroud)

工作示例:http://regexr.com?35q0u


在回应评论:你可以匹配吗?并且通过将\ w +置于正向前方:

[?&](?=\w+=)
Run Code Online (Sandbox Code Playgroud)

而且因为我很无聊并且有点像regexs,所以这里有一个与标签的值相匹配的:

(?<==).*?(?=[&?]\w+=|$)
Run Code Online (Sandbox Code Playgroud)

示例:http://regexr.com? 35q11由于全局匹配已启用,因此有多个突出显示的部分.