Ответ обновлен:
Этот шаблон сделает всю работу за вас:
(.*\/)[^?]*(?:(\?[^&]*).*)?
Пояснение:
(.*\/)
-> Будет сопоставлять и захватывать каждый символ до появления символа /
(. * - жадный оператор).
[^?]*
-> Будет соответствовать всему, что не является символом ?
.
(?:(\?[^&]*).*)?
-> Прежде всего, (?: ... )
- это группа без захвата, ?
в конце этой группы делает эту группу необязательной, (\?[^&]*)
будет сопоставлять и захватывать символ ?
и каждый не &
символ рядом с ним, последний .*
будет соответствовать всему после первого параметра в URL.
Затем вы можете заменить строку, используя только первую и вторую группы захвата.
Вот рабочий пример в regex101
Редактировать 2:
Как отмечалось в комментариях emsimpson92 , Id не всегда может быть первым параметром, поэтому вы можете использовать этот шаблон для соответствия параметру Id:
(.*\/)[^?]*(?:(\?).*?(Id=[^&]*).*)?
Важной частью здесь является то, что .*?(Id=[^&]*).*
соответствует параметру Id независимо от его положения.
.*?
-> Соответствует всем символам, пока не появится Id=
. Хитрость в том, что .*
является жадным квантификатором, но когда используется вместе с ?
, он становится ленивым.
Вот пример этого сценария в regex101