正则表达式:从两种模式中提取字符

Regex: extract characters from two patterns

我有以下字符串:

https://www.google.com/today/sunday/abcde2.hopeho.3345GETD?weatherType=RAOM&...
https://www.google.com/today/monday/jbkwe3.ho4eho.8495GETD?weatherType=WHTDSG&...

我想提取 jbkwe3.ho4eho.8495GETDabcde2.hopeho.3345GETD{weekday}/?weatherType= 之间的任何内容。

我试过 (?<=sunday\/)$.*?(?=\?weatherType=) 但它只适用于第一行,我想让它适用于所有字符串,而不管 {weekday}.

的值

我试过 (?<=\/.*\/)$.*?(?=\?weatherType=) 但没用。任何熟悉 Regex 的人都可以提供帮助吗?谢谢!

[更新] 我是正则表达式的新手,但我正在通过“查找”功能在 sublime 文本编辑器上对其进行试验,我认为应该是 PCRE(根据

在给出的示例中,您实际上只需要抓取最后一个正斜杠(“/”)和第一个问号(“?”)之间的字符。

您没有提到您使用的 flavor 正则表达式(即 PCRE、grep、Oracle 等),实际语法会因此而有所不同,但是通常,类似以下 (Perl) 替换正则表达式的东西可以处理给定的示例:

s/.*\/([^?]*)\?.*//gm

还有其他(且更有效)的方法,但这可以完成工作。

试试这个正则表达式:

(?:sun|mon|tues|wednes|thurs|fri|satur)day\/\K[^?]+(?=\?weatherType)

Click for Demo

Link to Code


解释:

  • (?:sun|mon|tues|wednes|thurs|fri|satur)day - 匹配星期几,即 sundaymondaytuesdaywednesdaythursdayfriday,saturday
  • \/ - 匹配 /
  • \K - 取消匹配到目前为止匹配的任何内容并假装匹配从 开始。这可以用于PCRE。
  • [^?]+ - 匹配任何非 ?
  • 字符的 1 次或多次出现
  • (?=\?weatherType) - 上面的子模式[^?]+ 将匹配所有不是 ? 的字符,直到它到达一个紧跟在 ? 后跟 weatherType

要使匹配不区分大小写,您可以在正则表达式前面加上 (?i),如图 here