正则表达式有3个反向引用,但有一个可选

时间:2013-01-21 09:43:20

标签: regex backreference

我有一个正则表达式,可以捕获三个反向引用,但其中一个(第二个)可能是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),q param和cd param。

我使用以下RegEx:

/.*\.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。我希望第二个反向引用为null(或未定义或其他)或仅q param,在此示例中为site%3Ajonathonoat.es。它目前还包括source参数(site%3Ajonathonoat.es&source=web)。

非常感谢任何帮助,谢谢!

我添加了JSFiddle of the code, look in your browser console for the output,谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

我也没有使用*或+因为它们是“贪婪”,总是使用*?还是+?当你要在你的字符串中找到分隔符时。有关贪婪的更多信息,请查看J.F.Friedls掌握Rgeular表达式或简单地here

答案 1 :(得分:0)

您希望中间组为:

q=([^&]*)

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

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