【问题标题】:Bringing a list of remaining items from list using REGEXMATCH - problem with + sign使用 REGEXMATCH 从列表中提取剩余项目的列表 - + 符号的问题
【发布时间】:2021-12-31 12:49:23
【问题描述】:

我有一个电子邮件地址列表(“所有电子邮件”),我有第二个我联系过的电子邮件列表(“已联系”),我想创建第三个列表,其中包含第一个电子邮件地址列表但不在第二个(“联系”)。 我使用 REGEXMATCH 来显示剩余电子邮件列表,效果很好:

=ARRAYFORMULA(FILTER(A2:A,NOT(REGEXMATCH(A2:A,TEXTJOIN("|",TRUE,B2:B)))))

问题是包含 + 号的电子邮件未被识别为已使用,并被添加到“收件人”列表中,尽管它们出现在“联系人”列表中。

例如,john@email.com 不会被带到第三个列表中(如预期的那样),但 john+2@email.com 将被添加到列表中,尽管他确实被联系到了。

这是一个示例,A 列是“所有电子邮件”,B 列是“已联系”,C 列是“联系”,我将有问题的电子邮件标记为黄色: https://docs.google.com/spreadsheets/d/1Fesr5tjjMhruP1otVHfQXvwYtmbz2nhT4THjZulHNfw/edit#gid=0

【问题讨论】:

    标签: regex google-sheets


    【解决方案1】:

    您需要转义特殊的正则表达式元字符:

    =ARRAYFORMULA(FILTER(A2:A,NOT(REGEXMATCH(A2:A,TEXTJOIN("|",TRUE,REGEXREPLACE(B2:B, "([[+$^*()\\{?.|])", "\\$1"))))))
    

    使用REGEXREPLACE(B2:B, "([[+$^*()\\{?.|])", "\\$1"),您可以匹配并捕获[+$^*()\\4 @、.| 带有反斜杠,它们匹配为文字字符。

    要了解 RE2 正则表达式风格中的特殊字符,请参阅 RE2 regex library documentation

    从技术上讲,([[+$^*()\\{?.|]) 是一个正则表达式,它匹配 并捕获组 1 中来自指定集合的​​单个字符 (...) 定义了一个 capturing group。我上面使用的REGEXREPLACE 命令用\\$1 替换每个找到的匹配项,即文字反斜杠和组1 的值。也就是说,这意味着我们在每个找到的匹配项前面加上一个文字反斜杠。替换模式中的反斜杠必须加倍,因为即使在替换模式中它也是一个特殊字符(如果您需要在替换模式中将其用作文字字符,它可以转义 $ 字符)。

    【讨论】:

    • 这是完美的,谢谢!你知道我在哪里可以读到关于你逃跑的任何好消息吗?我了解登录,但不了解如何在技术上进行。另外,最后的“\\$1”是什么?
    • @Tom 我添加了更多解释。 $1 是指第 1 组值的占位符。
    【解决方案2】:

    您还可以创建一个函数,用 RegExmatch 将“+”符号替换为另一个未被用作特殊字符的符号 .

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 2022-11-14
      • 1970-01-01
      • 2017-09-30
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多