Regex- чтобы извлечь строку до и после строки
Хочу извлечь строку до и после слова. Ниже приводится содержание.
Содержание:
1. http://www.example.com/myplan/mp/public/pl_be?Id=543543×tamp=06280435435
2. http://www.example.com/course/df/public/pl_de?Id=454354×tamp=0628031746
3. http://www.example.com/book/rg/public/pl_fo?Id=4445577×tamp=0628031734
4. http://www.example.com/trip/tr/public/pl_ds?Id=454354×tamp=06280314546
5. http://www.example.com/trip/tr/public/pl_ds
Я хочу захватить данные для строки выше, как показано ниже
1. http://www.example.com/myplan/mp/public/?Id=543543
2. http://www.example.com/course/df/public/?Id=454354
3. http://www.example.com/book/rg/public/?Id=4445577
4. http://www.example.com/trip/tr/public/?Id=454354
5. http://www.example.com/trip/tr/public/
Я пытался с (./ (?! [A-Za-z] {2} _ [A-Za-z] {2}).(? = &)). Но это не поможет.
Я надеюсь, что кто-то может помочь мне с этим.
2 ответа
Этот шаблон поймает то, что вы хотите в двух группах. Это более безопасно, чем другие примеры, которые были предложены до сих пор, потому что допускает некоторую разницу в URL.
(.*)\w\w_\w\w.*?(?:(?:[&?]\w+=\d+|%\w*)*?(\?Id=\d+)(?:.*))?
(.*)
захватывает все до вашей части xx_xx (группа захвата 1)\w\w_\w\w.*
соответствует xx_xx и все до следующего раздела захвата(?:[&?]\w+=\d+|%\w*)*?
позволяет быть другим & % или? свойства в вашем URL до вашего?Id=
имущество(\?Id=\d+)
захватывает ваше свойство Id (захватить группу 2)(?:.*)
не нужен, но это вызывает у меня проблемы, когда не весь текст выделен в регулярном выражении regex101 ¯\_(ツ)_/¯- необязательная группа без захвата здесь
(?:(?:[&?]\w+=\d+|%\w*)*?(\?Id=\d+)(?:.*))?
позволяет ему соответствовать URL, которые не имеют свойств идентификатора.
Ответ обновлен:
Этот шаблон сделает работу за вас:
(.*\/)[^?]*(?:(\?[^&]*).*)?
Объяснение:
(.*\/)
-> Будет соответствовать и захватить каждого персонажа, пока /
символ присутствует (.* - жадный оператор).
[^?]*
-> Будет соответствовать всем, что не является ?
персонаж.
(?:(\?[^&]*).*)?
-> Прежде всего, (?: ... )
является не захватывающей группой, ?
в конце это делает эту группу необязательной, (\?[^&]*)
будет соответствовать и захватить ?
характер и каждый не &
персонаж рядом с ним, последний .*
будет соответствовать всему после первого параметра в URL.
Затем вы можете заменить строку, используя только первую и вторую группы захвата.
Изменить 2:
Как упоминалось в комментариях emsimpson92, Id не всегда может быть первым параметром, поэтому вы можете использовать этот шаблон для соответствия параметру Id:
(.*\/)[^?]*(?:(\?).*?(Id=[^&]*).*)?
Важной частью здесь является то, что .*?(Id=[^&]*).*
соответствует параметру Id независимо от его положения.
.*?
-> Соответствует всем персонажам до Id=
настоящее. Хитрость в том, что .*
является жадным квантификатором, но когда используется в сочетании с ?
это становится ленивым.