php regex将重复列表与单个事件组合在一起并排除整个单词

问题描述 投票:2回答:1

我失败了,我需要一些正则表达式来替换一些文本信息。

以下任务也可以在非正则表达式中完成,但如果将它放在正则表达式中会很好,因为有很多要替换的。

但问题是:

  • 在集合[\w\. \&\=\?\-\(\)\'\+]中找到可能出现3-99次的字符,所以写:[\w\. \&\=\?\-\(\)\'\+]{3-99}
  • 在列表中,换行符可以出现一次,因此请写\n?
  • 在这个字符后出现一个固定的字符串,所以只需写:<[email protected]>
  • 但在字符列表中,“for”一词不应出现

因此,如果我使用:((?!for)[\w\. \&\=\?\-\(\)\'\+]{3,99}|(\n?))<test@mail\.se>,“for”这个词即使匹配也会匹配。有人有想法吗?

例如:在这个字符串中:

    To: Lasse Erikson <[email protected]>

我想匹配名称和邮件。

即使在这里:

To: Lasse Erikson <[email protected]>, Sara
    Larsson <[email protected]>

但在这里我不想取任何东西:

 for <[email protected]>; Thu, 14 Dec 2017 21:18:22 +0100 (CET)

因为行中有“for”。

我希望你明白这一点......

先感谢您

php regex regex-negation
1个回答
1
投票

PHP(PCRE)提供了一些动词来跳过或失败当前匹配过程,您可以使用它来跳过单词for或者如果您需要,则可以使整个匹配失败:

((?(?=\bfor\b)for(*SKIP)(*F))[ \w.(&=?\-+)](?(2)|(\R)?)){3,99}<[^<>@]*@[^<>]*>

Live demo

分解:

(   # Start of capturing group #1
    (?(?=\bfor\b)for(*SKIP)(*F))    # Skip over `for` if any
    [ \w.(&=?\-+)]  # Match whitelist characters
    (?(2)|(\R)?)    # One newline character between
){3,99} # Between 3 or 99 times, end of CG #1
<[^<>@]*@[^<>]*> # Match an email format
© www.soinside.com 2019 - 2024. All rights reserved.