【问题标题】:Capturing nth url occurence of email body捕获电子邮件正文的 url 出现
【发布时间】:2019-08-28 15:09:27
【问题描述】:

我有一个字符串,其中嵌入了多个 url,并且想要捕获用 括起来的第 n 次出现的 url。

我目前有(<.+>) 作为我的模式,它捕获第一个 url,但我希望它捕获第 n 个。我已经尝试过(<.+>){n},但无法让它在 regex101 上运行。

match(/(<.+>){3}/g)

我希望输出找到用 括起来的 url 的第三个实例,但是在 regex101 上它没有捕获。

示例字符串为:

URL1
<abc.com>
URL2
<cde.com>
URL3
<efg.com>
URL4
<ghi.com>

预期的输出是 efg.com。

【问题讨论】:

    标签: regex google-apps-script


    【解决方案1】:

    您需要将模式n 与非捕获组匹配次数:

    /(?:<(?:.|[\r\n])+?>(?:.|[\r\n])*?){2}<((?:.|[\r\n])+?)>(?:.|[\r\n])*/g
    

    efg.com 将位于$1

    如果您需要更改在所需位置之前有多少 &lt;url&gt;,则只需将 {2} 更新为您需要的任何内容。

    由于您没有可用的 /s 修饰符,因此您需要写出 (?:.|[\r\n]) 而不能简单地使用句点。

    细分为:

    • (?:&lt;(?:.|[\r\n])+?&gt;(?:.|[\r\n])*?){2} - 两次找到此模式并忽略结果
    • &lt;((?:.|[\r\n])+?)&gt; - 懒惰地将在&lt;&gt; 之间找到的所有内容放入$1
    • (?:.|[\r\n])* - 盲目且贪婪地匹配字符串的其余部分,以使模式无法递归。如果您不喜欢这部分,则可以省略 /g 修饰符将其删除

    https://regex101.com/r/LWTLgF/4

    【讨论】:

    • 看起来 google 脚本不支持多行标志 \s 但 google sheet 支持,所以我将电子邮件明文提取到 googlesheets 并使用您的模式提取第 n 个 url =REGEXEXTRACT(Sheet1!A4,"(?s)(?:&lt;.+?&gt;.*?){7}&lt;(.+?)&gt;.*")跨度>
    • @ghostFishKillah 哦,我明白了。 Google Apps 脚本似乎是基于 JS 的脚本服务,因此单行(dotall)/s 修饰符不可用。请参阅我的更新以获取有效的 JS 解决方案。
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多