6

我的正则表达式知识正在让我在这个问题上逃脱......

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

http://hostname.com?uri=http://website.com/company/YoYo+&+Co+Inc&type=company

...假设我们的 uri 参数本身不包含任何参数,我想手动解析 Javascript 中的查询参数,但显然我们嵌入的 uri 参数中的&符号使得它变得更加困难,然后简单地拆分所有&符号并使用它运行从那里。

我真正想做的是定义一个正则表达式,它只匹配问号和 & 号,后面跟着一个等号,然后再跟着另一个 & 号(或行尾)。我想出了这个接近但也包括非捕获文本,我不知道为什么:

[?&](?:[^&]+)=

...这导致匹配?uri=以及&type=接近但捕获的比我想要的更多。我做错了什么以至于它不只捕获?&匹配?换句话说,它应该只捕获?uri 之前的类型和&之前的类型。

4

1 回答 1

7

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

[?&](?==)

解释:

[?&]是一组只包含 ? 和 &。这意味着它将寻找其中之一。

(?= )这是一个积极的展望。这意味着“这必须在主要比赛之后出现,但不要包括在内”。所以让它找到一个 = 看起来有点有趣(?==)


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

[?&]\w+(?==)

+表示“匹配 1 个或多个”


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

(?<=[?&])\w+(?==)

工作中的例子:http ://regexr.com?35q0u


回复评论:您可以只匹配 ? 和 & 通过将 \w+ 放在积极的前瞻内:

[?&](?=\w+=)

而且因为我很无聊并且有点太喜欢正则表达式,所以这里有一个与标签的值匹配的:

(?<==).*?(?=[&?]\w+=|$)

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

于 2013-08-01T16:30:37.590 回答