Regex- чтобы извлечь строку до и после строки

Хочу извлечь строку до и после слова. Ниже приводится содержание.

Содержание:

1. http://www.example.com/myplan/mp/public/pl_be?Id=543543&timestamp=06280435435

2. http://www.example.com/course/df/public/pl_de?Id=454354&timestamp=0628031746

3. http://www.example.com/book/rg/public/pl_fo?Id=4445577&timestamp=0628031734

4. http://www.example.com/trip/tr/public/pl_ds?Id=454354&timestamp=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.

Затем вы можете заменить строку, используя только первую и вторую группы захвата.

Вот рабочий пример в regex101

Изменить 2:

Как упоминалось в комментариях emsimpson92, Id не всегда может быть первым параметром, поэтому вы можете использовать этот шаблон для соответствия параметру Id:

(.*\/)[^?]*(?:(\?).*?(Id=[^&]*).*)?

Важной частью здесь является то, что .*?(Id=[^&]*).* соответствует параметру Id независимо от его положения.

.*? -> Соответствует всем персонажам до Id= настоящее. Хитрость в том, что .* является жадным квантификатором, но когда используется в сочетании с ? это становится ленивым.

Вот пример этого сценария в regex101

Другие вопросы по тегам