0

想要在单词前后提取字符串。下面是内容。

内容:

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}). (?=&))。但这无济于事。

我希望有人可以帮助我解决这个问题。

4

2 回答 2

0

回复更新:

此模式将为您完成工作:

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

解释:

(.*\/)-> 将匹配并捕获每个字符,直到该/字符出现(.* 是一个贪心运算符)。

[^?]* -> 将匹配所有不是?字符的东西。

(?:(\?[^&]*).*)?-> 首先,(?: ... )是一个非捕获组,?最后的 使这个组成为可选的,(\?[^&]*)将匹配并捕获字符及其旁边的?每个非字符,最后一个将匹配 URL 中第一个参数之后的所有内容.&.*

然后,您可以仅使用第一个和第二个捕获组替换字符串。

这是 regex101 中的一个工作示例

编辑2:

正如评论中提到的emsimpson92,Id 不能总是第一个参数,因此您可以使用此模式来匹配 Id 参数:

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

这里的重要部分是.*?(Id=[^&]*).*匹配 Id 参数,无论其位置如何。

.*?-> 它匹配所有字符,直到Id=出现。这里的诀窍是这.*是一个贪婪的量词,但当与?它结合使用时会变成一个懒惰的量词。

这是 regex101 中此场景的示例

于 2018-06-28T15:46:02.133 回答
0

此模式将在两组中捕获您想要的内容。它比迄今为止建议的其他示例更安全,因为它允许 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+)(?:.*))?允许它匹配没有 ID 属性的 URL。

这是它如何工作的示例

于 2018-06-28T15:40:52.683 回答