【问题标题】:Regex to match nth occurrence and return part of the next line of a string正则表达式匹配第 n 次出现并返回字符串下一行的一部分
【发布时间】:2020-03-19 01:08:21
【问题描述】:

我正在使用 Zapier 从电子邮件正文中提取名称,我需要使用正则表达式为 Zap 的每个步骤返回字符串中第 n 次出现的名称。

这是我正在使用的DEMO

例如,对于 Zap 的第二部分,我想从字符串中返回 'John Morlu, CPA, CFE, CIA, CMA, CGFM, PMP, CISA'。

每次运行 Regex 时名称都会不同,因此 Regex 必须返回位于每个 '....... ......' 和 ' ('

到目前为止我有:

(?mis)\A(?:.?^.[ ]+){2}(.?)(?=[ ]*()

但我被卡住了

如何调整代码以返回列表中的第一个、第二个或第三个名称?

谢谢!

【问题讨论】:

  • 您是否需要正则表达式来专门选择第 n 个匹配项?或者您可以从一组匹配项中选择第 n 个匹配项吗?

标签: regex


【解决方案1】:

如果您只需要第 n 个匹配项(而不是从中选择第 n 个匹配项的列表),则获取第一个匹配项:

(?:\.{37}\s+.+?\(.*?){0}\.{37}\s+(.+?)\(

这是第二个:

(?:\.{37}\s+.+?\(.*?){1}\.{37}\s+(.+?)\(

第三个:

(?:\.{37}\s+.+?\(.*?){2}\.{37}\s+(.+?)\(

等等

基本解释: - 前半部分,以?:开头为非捕获组;它需要匹配,但它不是捕获内容的一部分。 - 它后面的{x} 导致它匹配x 次,所以匹配第一个,即 0 次,匹配第二个 1 次,依此类推。 - 表达式的其余部分再次匹配相同的内容,但现在是第 1 组。

仅获取一个可供选择的列表:

\.{37}\s+(.+?)\(

【讨论】:

  • 太棒了,非常感谢!我只是在末尾添加了 [ ] 以删除最后的空格: (?:\.{37}\s+.+?(.*?){0}\.{37}\s+(.+?)[ ](感谢您的帮助!!!
  • 我使用 {1} 尝试了第二场比赛,但它似乎不起作用?你知道为什么吗?这是演示:regex101.com/r/tbVSmD/3
  • 您需要设置正则表达式引擎选项,以便“单行|点匹配换行符”或/gms。见这里regex101.com/r/tbVSmD/4
  • 谢谢你,这是有道理的——不幸的是,因为我使用的是 Zapier,没有办法改变正则表达式引擎选项——你知道是否有办法在不改变引擎选项的情况下做到这一点?
  • 我想通了 - 我需要添加 (?mis) 所以最终版本是 (?mis)(?:\.{37}\s+.+?(.*?){1 }\.{37}\s+(.+?)[ ](再次感谢您的支持!
【解决方案2】:

要获取列表中第 3rd 人感兴趣的信息,您可以使用以下正则表达式:

(?:(?:^.*\s)*?\.{20}\.*\s+){3}\K.[^\)]*\)

由于没有指定正则表达式引擎,所以我使用了 PCRE (PHP)。

Demo

我假设句点的分割线(示例中每行 37 个)至少包含 20 个句点。

正则表达式执行以下操作。

(?:             # begin a non-cap group
  (?:^.*\s)     # match entire line, incl. newline, in a non-cap group
  *?            # execute the non-cap group 0+ times, non-greedily
  \.{20}\.*\s+  # match entire line of 20+ periods, incl.
                #   the newline, followed by 0+ empty lines
)               # end the non-cap group
{3}             # execute the non-cap group 3 times
\K              # forget everything matched so far
[^\)]*          # match 0+ chars other than ')'
\)              # match ')'

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 2011-01-02
    • 2015-04-10
    • 1970-01-01
    • 2016-09-28
    • 2016-03-18
    相关资源
    最近更新 更多