Regex - чтобы извлечь строку до и после строки - PullRequest
0 голосов
/ 28 июня 2018

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

Содержание:

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 ]

0 голосов
/ 28 июня 2018

Ответ обновлен:

Этот шаблон сделает всю работу за вас:

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

Пояснение:

(.*\/) -> Будет сопоставлять и захватывать каждый символ до появления символа / (. * - жадный оператор).

[^?]* -> Будет соответствовать всему, что не является символом ?.

(?:(\?[^&]*).*)? -> Прежде всего, (?: ... ) - это группа без захвата, ? в конце этой группы делает эту группу необязательной, (\?[^&]*) будет сопоставлять и захватывать символ ? и каждый не & символ рядом с ним, последний .* будет соответствовать всему после первого параметра в URL.

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

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

Редактировать 2:

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

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

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

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

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

0 голосов
/ 28 июня 2018

Этот шаблон поймает то, что вы хотите в двух группах. Это более безопасно, чем другие примеры, которые были предложены до сих пор, потому что допускает некоторую разницу в 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-адресам, которые не имеют свойств идентификатора.

Вот пример того, как это работает

...