регулярное выражение с 3 обратными ссылками, но одна необязательная

У меня есть регулярное выражение, которое захватывает три обратные ссылки, хотя одна (вторая) может быть 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"]

1-я обратная ссылка верна, это .co.uk, как и 3-я; это 1. Я хочу, чтобы вторая обратная ссылка была либо нулевой (или неопределенной, или что-то еще), либо просто параметром q, в этом примере site%3Ajonathonoat.es. В настоящее время он также включает параметр source (site%3Ajonathonoat.es&source=web).

Любая помощь будет принята с благодарностью, спасибо!

Я добавил JSFiddle кода, посмотрите результат в консоли браузера, спасибо !


person Jonathon Oates    schedule 21.01.2013    source источник
comment
Я бы также подумал о разборе URL-адреса: stackoverflow.com/questions/736513/   -  person Kobi    schedule 21.01.2013


Ответы (2)


Вы хотите, чтобы средняя группа была:

q=([^&]*)

Это захватит символы, отличные от амперсанда. Это также позволяет использовать нулевые символы, поэтому вы можете удалить необязательную группу (?).

Рабочий пример: http://rubular.com/r/AJkXxgeX5K

person Kobi    schedule 21.01.2013

при отрицании классов символов я всегда добавляю множитель к самому классу:

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

Я также рекомендую не использовать * или +, поскольку они «жадные», всегда используйте *? или +? когда вы собираетесь найти разделители внутри своей строки. Для получения дополнительной информации о жадности проверьте J.F.Friedls Mastering Rgeular Expressions или просто здесь

person DesertEagle    schedule 21.01.2013