想要提取单词前后的字符串。以下是内容。
内容:
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}))。(?=& ))。但这无济于事。
我希望有人可以帮我这个忙。
答案 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。答案 1 :(得分:0)
此模式将为您完成工作:
(.*\/)[^?]*(?:(\?[^&]*).*)?
说明:
(.*\/)
->将匹配并捕获每个字符,直到出现/
字符(。*是贪婪的运算符)。
[^?]*
->将匹配所有非?
字符。
(?:(\?[^&]*).*)?
->首先,(?: ... )
是一个非捕获组,此末尾的?
使该组成为可选组,(\?[^&]*)
将匹配并捕获?
字符及其旁边的每个非&
字符,最后一个.*
将匹配URL中第一个参数之后的所有内容。
然后,您可以仅使用第一个和第二个捕获组来替换字符串。
Here is a working example in regex101
编辑2:
正如评论中提到的 emsimpson92 一样,ID不一定总是第一个参数,因此您可以使用此模式来匹配ID参数:
(.*\/)[^?]*(?:(\?).*?(Id=[^&]*).*)?
这里重要的一点是.*?(Id=[^&]*).*
无论其位置如何都与ID参数匹配。
.*?
->它匹配所有字符,直到出现Id=
。这里的技巧是.*
是一个贪婪的量词,但是当与?
结合使用时,它变成了一个懒惰的量词。