正则表达式-在字符串之前和之后提取字符串

时间:2018-06-28 15:34:00

标签: regex dynatrace

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

内容:

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 :(得分: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。

Here's an example of how it works

答案 1 :(得分:0)

响应已更新:

此模式将为您完成工作:

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

说明:

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

[^?]*->将匹配所有非?字符。

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

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

Here is a working example in regex101

编辑2:

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

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

这里重要的一点是.*?(Id=[^&]*).*无论其位置如何都与ID参数匹配。

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

Here is an Example of this scenario in regex101