1

我有一个正则表达式可以捕获三个反向引用,尽管一个(第二个)可能是null.

给定流动的字符串:

http://www.google.co.uk/url?sa=t&rct=j&q=site%3Ajonathonoat.es&source=web&cd=1&ved=0CC8QFjAA&url=http%3A%2F%2Fjonathonoat.es%2Fbritish-mozcast%2F&ei=MQj9UKejDYeS0QWruIHgDA&usg=AFQjCNHy1cDoWlIAwyj76wjiM6f2Rpd74w&bvm=bv.41248874,d.d2k,.co.uk,site%3Ajonathonoat.es&source=web,1

我希望捕获 TLD(在本例中为 .co.uk)、qparam 和cdparam。

我正在使用以下正则表达式:

/.*\.google([a-z\.]*).*q=(.*[^&])?.*cd=(\d*).*/i

除了第二个反向引用之外,哪个有效,包括直到参数的其他参数cd,我目前得到这个:

["http://www.google.co.uk/url?sa=t&rct=j&q=site%3Ajo…,d.d2k,.co.uk,site%3Ajonathonoat.es&source=web,1 ", ".co.uk", "site%3Ajonathonoat.es&source=web", "1", index: 0, input: "http://www.google.co.uk/url?sa=t&rct=j&q=site%3Ajo…,d.d2k,.co.uk,site%3Ajonathonoat.es&source=web,1"]

第一个反向引用是正确的,.co.uk第三个也是正确的;它是1。在本例中,我希望第二个反向引用为空(或未定义或其他)或只是q参数site%3Ajonathonoat.es。它目前source也包含参数 ( site%3Ajonathonoat.es&source=web)。

任何帮助将不胜感激,谢谢!

我已经添加了代码的 JSFiddle,在浏览器控制台中查看输出,谢谢!

4

2 回答 2

1

如果否定字符类,我总是向类本身添加一个乘数:

/.*\.google([a-z\.]*).*q=([^&]*?)?.*cd=(\d*).*/i

我还建议不要使用 * 或 +,因为它们“贪婪”,总是使用 *?或+?当您要在字符串中查找分隔符时。有关贪婪的更多信息,请查看 JFFriedls Mastering Rgeular Expressions 或简单地在这里

于 2013-01-21T09:50:36.070 回答
0

您希望中间组是:

q=([^&]*)

这将捕获除 & 以外的字符。这也允许零个字符,因此您可以删除可选组 ( ?)。

工作示例:http ://rubular.com/r/AJkXxgeX5K

于 2013-01-21T09:48:01.530 回答