【问题标题】:Regex to replace email address domains?正则表达式替换电子邮件地址域?
【发布时间】:2019-07-06 01:56:17
【问题描述】:

我需要一个正则表达式来混淆我拥有的数据库转储文件中的电子邮件。我想用@fake.com 之类的设置域替换所有域,这样我就不会冒险在开发过程中向真实的人发送电子邮件。电子邮件必须是唯一的才能匹配数据库约束,所以我只想替换域并保留用户名。

我目前有这个用于查找电子邮件的正则表达式

\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

如何将此搜索正则表达式转换为可用于 Sublime Text、SED 或 Vim 中的查找和替换操作的正则表达式?

编辑:

请注意,我刚刚意识到在这种情况下我可以替换 @[A-Z0-9.-]+\.[A-Z]{2,4}\b 找到的所有字符串,但在学术上我仍然对如何将电子邮件正则表达式的每个部分视为令牌并替换用户名/域感兴趣独立。

【问题讨论】:

  • 搜索和查找和替换正则表达式之间没有区别,是吗?如果你想正确地完成这项工作,你可能想看看here
  • @m.buettner,不是吗,我不需要将电子邮件地址分成令牌并替换特定令牌,这样我就不会替换整个电子邮件地址吗?
  • 您可以仅搜索域 (@....) 并将其替换 - 如果您可以假设 @ 不会出现在其他上下文中。您还可以使用捕获组和反向引用。
  • @JamesMcMahon 哦,我明白你的意思了。我的错。

标签: regex email replace


【解决方案1】:

SublimeText

SublimeText 使用Boost syntax,它支持 Perl 正则表达式中相当大的功能子集。但对于这项任务,您不需要所有这些高级构造。

以下是两种可能的方法:

    1234563
  1. 如果您在替换字符串中使用捕获组(pattern) 和反向引用。

    找到什么

    \b([A-Z0-9._%-]+)@[A-Z0-9.-]+\.[A-Z]{2,4}\b
    

    ([A-Z0-9._%-]+) 是正则表达式中的第一个(也是唯一一个)捕获组。

    替换为

    $1@fake.com
    

    $1指的是第一个捕获组捕获的文本。

请注意,对于上述两种方法,您都需要关闭区分大小写(显示为左下角的第二个按钮),除非您特别想只删除以全大写形式编写的电子邮件。

【讨论】:

  • 另一种方法是使用 positive lookbehind 来避免捕获电子邮件的前半部分并仅针对域。
  • @plalx:后视可能并不总是有效,因为模式是可变宽度的。
  • 很高兴知道,我已经实现了与您相同的解决方案,但在后面胡闹,无法使其工作。我想这可以解释为什么......我会阅读更多相关信息;)
【解决方案2】:

你可以对 Vim 使用以下命令:

:%s/\(\<[A-Za-z0-9._%-]\+@\)[A-Za-z0-9.-]\+\.[A-Za-z]\{2,4}\>/\1fake.com/g

\(\) 之间的所有内容都将成为一个组,该组将被该组的转义数字替换(在本例中为 \1)。我还修改了正则表达式以匹配小写字母并具有与 Vim 兼容的语法。

您也可以通过将\c 放在正则表达式中的任何位置来关闭区分大小写,如下所示:

:%s/\c\(\<[A-Z0-9._%-]\+@\)[A-Z0-9.-]\+\.[A-Z]\{2,4}\>/\1fake.com/g

还请注意,行首的 % 要求 Vim 在整个文件中进行替换,而最后的 g 要求在同一行中进行多次替换。

另一种方法是使用零宽度匹配 (\@&lt;=):

:%s/\c\(\<[A-Z0-9._%-]\+@\)\@<=[A-Z0-9.-]\+\.[A-Z]\{2,4}\>/fake.com/g

【讨论】:

  • vim 是否支持i 标志?如果是这样,那么您不必修改正则表达式来支持区分大小写。
  • @nhahtdh 感谢您的建议。我添加了一个带有\c 标志的版本:)
  • 谢谢,你的答案和 nhahtdh 的一样好,但我最终使用 sublime 进行更改,所以我给了他答案
  • @JamesMcMahon 不客气。没问题。我也喜欢他的回答:)
  • 我在尝试将您的正则表达式转换为 sed 语法时遇到了很糟糕的情况,有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2012-01-25
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多